diff --git a/gembase/src/common/GEMApplication.cc b/gembase/src/common/GEMApplication.cc index 5dd57db1..7af37b96 100644 --- a/gembase/src/common/GEMApplication.cc +++ b/gembase/src/common/GEMApplication.cc @@ -74,7 +74,6 @@ gem::base::GEMApplication::GEMApplication(xdaq::ApplicationStub *stub) : p_appInfoSpaceToolBox = std::shared_ptr(new utils::GEMInfoSpaceToolBox(this, p_appInfoSpace, - // p_gemMonitor, false)); CMSGEMOS_DEBUG("GEMApplication::application infospace has name: " << p_appInfoSpace->name()); CMSGEMOS_DEBUG(m_urn); @@ -88,7 +87,6 @@ gem::base::GEMApplication::GEMApplication(xdaq::ApplicationStub *stub) : } p_monitorInfoSpaceToolBox = std::shared_ptr(new utils::GEMInfoSpaceToolBox(this, p_monitorInfoSpace, - // p_gemMonitor, false)); toolbox::net::URN cfgISURN(m_urn+toolbox::toString(":config-infospace")); if (xdata::getInfoSpaceFactory()->hasItem(cfgISURN.toString())) { @@ -100,7 +98,6 @@ gem::base::GEMApplication::GEMApplication(xdaq::ApplicationStub *stub) : } p_configInfoSpaceToolBox = std::shared_ptr(new utils::GEMInfoSpaceToolBox(this, p_configInfoSpace, - // p_gemMonitor, false)); CMSGEMOS_DEBUG("GEMApplication::GEM application has infospace named " << p_appInfoSpace->name()); diff --git a/gemdaqmonitor/Makefile b/gemdaqmonitor/Makefile index e0f3883e..b5e7c818 100644 --- a/gemdaqmonitor/Makefile +++ b/gemdaqmonitor/Makefile @@ -44,7 +44,8 @@ DependentLibraryDirs+=$(BUILD_HOME)/gemhardware/utils/lib/$(XDAQ_OS)/$(XDAQ_PLAT DependentLibraryDirs+=$(XHAL_ROOT)/lib DependentLibraries =gembase -DependentLibraries+=gemhwdevices gemhwutils xhal-client +#FIXME hacky linking of xhal-base +DependentLibraries+=gemhwdevices gemhwutils xhal-client xhal-base DependentLibraries+=boost_iostreams include $(XDAQ_ROOT)/$(BUILD_SUPPORT)/Makefile.rules diff --git a/gemhardware/devices/Makefile b/gemhardware/devices/Makefile index 57292ec2..fa203c7d 100644 --- a/gemhardware/devices/Makefile +++ b/gemhardware/devices/Makefile @@ -12,6 +12,10 @@ ifndef PROJECT_NAME PROJECT_NAME=cmsgemos endif +ifndef GEM_VARIANT +GEM_VARIANT = ge11 +endif + Project=$(PROJECT_NAME) ShortProject=gem Package=gemhardware/devices @@ -28,12 +32,11 @@ GEMHWDEVICES_VER_PATCH=1 include $(CfgDir)/mfDefsGEM.mk +UserCFlags+=-DGEM_VARIANT="$(GEM_VARIANT)" + Sources =version.cc -# Sources =utils/GEMCrateUtils.cc Sources+=GEMHwDevice.cc Sources+=amc/HwGenericAMC.cc -Sources+=glib/HwGLIB.cc -#Sources+=ctp7/HwCTP7.cc Sources+=optohybrid/HwOptoHybrid.cc DynamicLibrary=gemhwdevices @@ -42,8 +45,8 @@ IncludeDirs =$(XDAQ_ROOT)/include IncludeDirs+=$(BUILD_HOME)/$(Package)/include IncludeDirs+=$(BUILD_HOME)/gemhardware/utils/include IncludeDirs+=$(BUILD_HOME)/gemutils/include -IncludeDirs+=$(uHALROOT)/include IncludeDirs+=$(XHAL_ROOT)/include +IncludeDirs+=$(CTP7_ROOT)/include DependentLibraryDirs+=$(BUILD_HOME)/gemhardware/utils/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) DependentLibraryDirs+=$(BUILD_HOME)/gemutils/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) @@ -52,10 +55,10 @@ DependentLibraryDirs+=$(XHAL_ROOT)/lib LibraryDirs+=$(BUILD_HOME)/gemhardware/utils/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) LibraryDirs+=$(BUILD_HOME)/gemutils/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) -LibraryDirs+=$(uHALROOT)/lib LibraryDirs+=$(XHAL_ROOT)/lib -DependentLibraries =cactus_uhal_uhal xhal-client +#FIXME hacky linking of xhal-base +DependentLibraries =xhal-client xhal-base DependentLibraries+=gemutils gemhwutils include $(XDAQ_ROOT)/$(BUILD_SUPPORT)/Makefile.rules diff --git a/gemhardware/devices/include/gem/hw/devices/GEMHwDevice.h b/gemhardware/devices/include/gem/hw/devices/GEMHwDevice.h index 2902ae72..50ad3228 100644 --- a/gemhardware/devices/include/gem/hw/devices/GEMHwDevice.h +++ b/gemhardware/devices/include/gem/hw/devices/GEMHwDevice.h @@ -9,13 +9,11 @@ // can we decouple completely from these? #include "toolbox/string.h" -#include "uhal/uhal.hpp" -/* #include "uhal/Utilities.hpp" /\* removed in 2.5 or 2.6 *\/ */ -#include "uhal/utilities/bits.hpp" -#include "uhal/utilities/files.hpp" - #include "xhal/client/XHALInterface.h" -/* #include "xhal/XHALDevice.h" */ +#include "xhal/common/rpc/call.h" + +#include "ctp7_modules/common/hw_constants.h" +#include "ctp7_modules/common/utils.h" #include "gem/hw/utils/GEMCrateUtils.h" #include "gem/hw/devices/exception/Exception.h" @@ -27,118 +25,20 @@ #include "gem/utils/Lock.h" #include "gem/utils/LockGuard.h" -typedef uhal::exception::exception uhalException; - -// for multiple reads with single dispatch with named registers -typedef std::pair register_pair; -typedef std::vector register_pair_list; - -// for multiple reads with single dispatch with addressed registers -typedef std::pair addressed_register_pair; -typedef std::vector addressed_register_pair_list; - -// for multiple reads with single dispatch with addressed and masked registers -typedef std::pair, uint32_t> masked_register_pair; -typedef std::vector masked_register_pair_list; - -typedef std::pair > register_value; -typedef std::vector register_val_list; - - -/* namespace uhal { */ -/* class HwInterface; */ -/* } */ - -/* namespace xhal { */ -/* class XHALInterface; */ -/* } */ - namespace gem { namespace hw { - class GEMHwDevice : public xhal::client::XHALInterface, public uhal::HwInterface + class GEMHwDevice : public xhal::client::XHALInterface { public: - /* IPBus transactions still have some problems in the firmware - so it helps to retry a few times in the case of a failure - that is recognized - */ - static constexpr uint8_t MAX_IPBUS_RETRIES = 5; - - /** TODO: REMOVE or REDESIGN - * @struct DeviceErrors - * @brief This structure stores retrieved counters related to the IPBus transaction errors - * @var DeviceErrors::BadHeader - * BadHeader is a counter for the number times the IPBus transaction returned a bad header - * @var DeviceErrors::ReadError - * ReadError is a counter for the number read transaction errors - * @var DeviceErrors::Timeout - * Timeout is a counter for the number for the number of timeouts - * @var DeviceErrors::ControlHubErr - * ControlHubErr is a counter for the number control hub errors encountered - */ - typedef struct DeviceErrors { - int BadHeader ; - int ReadError ; - int Timeout ; - int ControlHubErr; - - DeviceErrors() : BadHeader(0),ReadError(0),Timeout(0),ControlHubErr(0) {}; - void reset() { BadHeader=0; ReadError=0; Timeout=0; ControlHubErr=0; return; }; - } DeviceErrors; - /** * @brief GEMHwDevice constructor based on hostname and connection file * - * @param deviceName card name (connection file and IP resolveable) - * @param connectionFile name of the connection file to find the `uhal` device endpoint + * @param deviceName card name (IP resolveable) */ - GEMHwDevice(std::string const& deviceName, - std::string const& connectionFile); + GEMHwDevice(std::string const& deviceName); - /** - * @brief GEMHwDevice constructor based on hostname, URI, and address table - * - * @param deviceName card name (connection file and IP resolveable) - * @param connectionURI `uhal` device endpoint - * @param addressTable address table to be used with `uhal` register access - */ - GEMHwDevice(std::string const& deviceName, - std::string const& connectionURI, - std::string const& addressTable); - - /** - * @brief GEMHwDevice constructor based on hostname and existing uhal::HwInterface - * - * @param deviceName card name (connection file and IP resolveable) - * @param uhalDevice already created uhal::HwInterface to use for connection - */ - GEMHwDevice(std::string const& deviceName, - uhal::HwInterface const& uhalDevice); - - /** TODO: IMPLEMENT - * @brief GEMHwDevice constructor based on shelf, slot (with optional parameters to set up the uhal connection) - * @description This constructor will take only physical properties of the card and create the URI, using a default address table - * The URI has several necessary components: - * - protocol: ipbusudp, ipbustcp, chtcp - * - port: default for ipbusNative is 50001, otherwise 60002 - * - chHost: if using a control hub, the host on which the control hub is running - * - cardname: gem-shelf-amc - * The URI will be constructed as follows: - * - chtcp-2.0:://:<10203>?target=:, for a controlhub connection - * - :://:, for a standalone ipbus connection (TCP:ipbustcp-2.0 or UDP: ipbusudp-2.0) - * - * @param shelf shelfID of the device connection point - * @param slot AMC slot in a uTCA shelf (blade in an ATCA crate) - * @param ipbusNative, will be false for any Zynq or similar type devices - * @param chHost, only possible for ipbusNative devices, the control hub hostname - * / - GEMHwDevice(uint8_t const& shelf, - uint8_t const& shelf, - bool const& ipbusNative=false, - std::string const& chHost=""); - */ virtual ~GEMHwDevice(); /* FIXME @@ -150,7 +50,7 @@ namespace gem { /////////////////////////////////////////////////////////////////////////////////////// //****************Methods implemented for convenience on uhal devices****************// /////////////////////////////////////////////////////////////////////////////////////// - + //FIXME review docs w.r.t. uhal /** * @defgroup uhalwrappers Generic read/write wrapper functions on uhal/IPBus devices. * The operations will be the same for the GLIB, CTP7, OptoHybrid3 and AMC13 @@ -170,94 +70,6 @@ namespace gem { */ uint32_t readReg(std::string const& regName); - /** - * @ingroup uhalwrappers - * @brief read from a register identified by a raw address - * - * @usage FILLME - * - * @param regAddr address of the register to read - * - * @retval returns the 32 bit unsigned value in the register - */ - uint32_t readReg(uint32_t const& regAddr); - - /** - * @ingroup uhalwrappers - * @brief read from a register identified by an address, with the supplied mask - * - * @usage FILLME - * - * @param regAddr address of the register to read - * @param regMask mask of the register to read - * - * @retval returns the 32 bit unsigned value in the register - */ - uint32_t readReg(uint32_t const& regAddr, uint32_t const& regMask); - - /** - * @ingroup uhalwrappers - * @brief read from a register identified by prefix.name in the address table - * - * @usage FILLME - * - * @param regPrefix prefix in the address table, possibly root nodes - * @param regName name of the register to read from the address table - * - * @retval returns the 32 bit unsigned value - */ - uint32_t readReg(const std::string ®Prefix, const std::string ®Name) { return readReg(regPrefix+"."+regName); }; - - /** - * @ingroup uhalwrappers - * @brief read from a register identified by prefix.name in the address table - * FIXME REDUNDANT - * - * @usage This function is redundant, if the address table knows there is a mask applied - * it will be used when calculating the return type - * - * @param regName name of the register to read - * - * @retval returns the 32 bit unsigned value in the register - */ - uint32_t readMaskedAddress(std::string const& regName); - - /** - * @ingroup uhalwrappers - * @brief read list of registers in a single transaction (one dispatch call) - * into the supplied vector regList - * - * @usage Return values are stored in the regList object passed in as a parameter - * - * @param regList list of register name and uint32_t value to store the result - * @param freq integer number of transactions to bundle (-1 for all) - */ - void readRegs(register_pair_list ®List, int const& freq=8); - - /** - * @ingroup uhalwrappers - * @brief read list of registers in a single transaction (one dispatch call) - * into the supplied vector regList - * - * @usage FILLME - * - * @param regList list of register address and uint32_t value to store the result - * @param freq integer number of transactions to bundle (-1 for all) - */ - void readRegs(addressed_register_pair_list ®List, int const& freq=8); - - /** - * @ingroup uhalwrappers - * @brief read list of registers in a single transaction (one dispatch call) - * into the supplied vector regList - * - * @usage FILLME - * - * @param regList list of register address/mask pair and uint32_t value to store the result - * @param freq integer number of transactions to bundle (-1 for all) - */ - void readRegs(masked_register_pair_list ®List, int const& freq=8); - /** * @ingroup uhalwrappers * @brief write to a register identified by a register name @@ -269,209 +81,17 @@ namespace gem { */ void writeReg(std::string const& regName, uint32_t const val); - /** - * @ingroup uhalwrappers - * @brief write to a register identified by a raw address - * - * @usage FILLME - * - * @param regAddr address of the register to read - * @param val value to write to the register - */ - void writeReg(uint32_t const& regAddr, uint32_t const val); - - /** - * @ingroup uhalwrappers - * @brief write to a register identified by prefix.name in the address table - * - * @usage FILLME - * - * @param regPrefix prefix in the address table to the register - * @param regName name of the register to write to - * @param val value to write to the register - */ - void writeReg(const std::string ®Prefix, const std::string ®Name, uint32_t const val) { return writeReg(regPrefix+"."+regName, val); }; - - /** - * @ingroup uhalwrappers - * @brief write list of registers in a single transaction (one dispatch call) - * using the supplied vector regList - * - * @usage FILLME - * - * @param regList std::vector of a pairs of register names and values to write - * @param freq integer number of transactions to bundle (-1 for all) - */ - void writeRegs(register_pair_list const& regList, int const& freq=8); - - /** - * @ingroup uhalwrappers - * @brief write single value to a list of registers in a single transaction - * (one dispatch call) using the supplied vector regList - * - * @usage FILLME - * - * @param regList list of registers to write a value to - * @param regValue uint32_t value to write to the list of registers - * @param freq integer number of transactions to bundle (-1 for all) - */ - void writeValueToRegs(std::vector const& regList, uint32_t const& regValue, int const& freq=8); - - /** - * @ingroup uhalwrappers - * @brief write zero to a single register - * - * @usage FILLME - * - * @param regName register to zero - */ - void zeroReg( std::string const& regName) { writeReg(regName,0); }; - - /** - * @ingroup uhalwrappers - * @brief write zero to a list of registers in a single transaction (one dispatch call) - * using the supplied vector regNames - * - * @usage FILLME - * - * @param regNames list of registers to zero - */ - void zeroRegs(std::vector const& regNames, int const& freq=8); - - /** - * @ingroup uhalwrappers - * @brief read from a memory block - * - * @usage FILLME - * - * @param regName fixed size memory block to read from - */ - std::vector readBlock(std::string const& regName); - - /** - * @ingroup uhalwrappers - * @brief read from a memory block - * - * @usage FILLME - * - * @param regName name of memory block to read from - * @param nWords size of the memory block to read - * - * @retval a vector of 32 bit unsigned values - */ - std::vector readBlock(std::string const& regName, size_t const& nWords); - - /** - * @ingroup uhalwrappers - * @brief read from a memory block - * - * @usage FILLME - * - * @param regName name of memory block to read from - * @param buffer a pointer to an array containing the read values - * @param nWords size of the memory block to read - * - * @retval the size of the returned array - */ - uint32_t readBlock(std::string const& regName, uint32_t* buffer, size_t const& nWords); - - /* / ** */ - /* * @ingroup uhalwrappers */ - /* * @brief read from a memory block */ - /* * */ - /* * @usage */ - /* * */ - /* * @param regName name of memory block to read from */ - /* * @param buffer a vector of pointers to memory locations containing the read values */ - /* * @param nWords size of the memory block to read */ - /* * */ - /* * @retval the size of the returned array */ - /* * / */ - /* uint32_t readBlock(std::string const& regName, std::vector& buffer, */ - /* size_t const& nWords); */ - - /** - * @ingroup uhalwrappers - * @brief write to a memory block - * - * @usage FILLME - * - * @param regName name of memory block to write to - * @param values list of 32-bit words to write into the memory block - */ - void writeBlock(std::string const& regName, std::vector const values); - - /** - * @ingroup uhalwrappers - * @brief write zeros to a block of memory - * - * @usage FILLME - * - * @param regName block or memory to zero - */ - void zeroBlock(std::string const& regName); - - /** - * @ingroup uhalwrappers FIXME, isn't this a block, not a FIFO? - * @brief readFIFO(std::string const& regName) read from a FIFO/memory port - * - * @usage FILLME - * - * @param regName fixed size memory block to read from - */ - std::vector readFIFO(std::string const& regName); - //size_t readFIFO(std::string const& regName, size_t nWords, uint32_t* buffer); /*hcal style */ - - /** - * @ingroup uhalwrappers - * @brief read from a FIFO/memory port a fixed amount of data - * - * @usage FILLME - * - * @param regName FIFO to read from - * @param nWords number of words to read from the FIFO - * - * @retval a vector of 32 bit unsigned values - */ - std::vector readFIFO(std::string const& regName, size_t const& nWords); - - /** - * @ingroup uhalwrappers - * @brief write to a FIFO - * - * @usage FILLME - * - * @param regName FIFO to write to - * @param values list of 32-bit words to write into the FIFO - */ - void writeFIFO(std::string const& regName, std::vector const values); - - /** - * @ingroup uhalwrappers FIXME: does this even make semantic sense? - * @brief reset a FIFO - * - * @usage FILLME - * - * @param regName FIFO to zero - */ - void zeroFIFO(std::string const& regName); - - // These methods provide access to the member variables // specifying the `uhal` address table name and the IPbus protocol // version. /** FIXME getters */ - const std::string getAddressTableFileName() const { return m_addressTable; }; - const std::string getDeviceBaseNode() const { return m_deviceBaseNode; }; const std::string getDeviceID() const { return m_deviceID; }; /** FIXME setters, should maybe be private/protected? defeats the purpose? */ - void setAddressTableFileName(std::string const& name) { m_addressTable = "file://${GEM_ADDRESS_TABLE_PATH}/"+name; }; - void setDeviceBaseNode(std::string const& deviceBase) { m_deviceBaseNode = deviceBase; }; void setDeviceID(std::string const& deviceID) { m_deviceID = deviceID; }; /////////////////////////////////////////////////////////////////////////////////////// @@ -480,10 +100,6 @@ namespace gem { std::string getLoggerName() const { return m_gemLogger.getName(); }; - void updateErrorCounters(std::string const& errCode) const; - - virtual std::string printErrorCounts() const; - /** * @brief performs a general reset of the GLIB * @@ -509,8 +125,6 @@ namespace gem { */ virtual void linkReset(uint8_t const& link)=0; - mutable DeviceErrors m_ipBusErrs; - bool b_is_connected; protected: @@ -518,22 +132,25 @@ namespace gem { mutable gem::utils::Lock m_hwLock; + /** + * @brief loads the necessary modules into the RPC module manager + * @details Provides basic read/write functionality, reimplemented in daughter classes + * + * @usage FILLME + * + * @param should reconnect in the case of an already connected manager + */ + virtual void connectRPC(bool reconnect=false); + + /** * @brief Performs basic setup for the device * sets connection details (OBSOLETE) * sets logging level to Error - * Not inherited, but calls a pure virtual function (connectRPC) + * Not inherited **/ void setup(std::string const& deviceName); - /** - * @brief Performs a check on the RPC response to verify whether there is an `error` key set - * Every method that makes an RPC call *must* use this function to check the response - * - * @param caller should be the name of the function, only used in the error message - **/ - void checkRPCResponse(std::string const& caller) const; - /** * @brief Extracts the device parameters from the device name * @@ -552,32 +169,14 @@ namespace gem { GEMHwDevice( const GEMHwDevice& other) ; // prevents construction-copy GEMHwDevice& operator=( const GEMHwDevice&) ; // prevents copying - /** - * @brief loads the necessary modules into the RPC module manager - * @details pure virtual, must be implemented in derived classes - * - * @usage FILLME - * - * @param should reconnect in the case of an already connected manager - */ - virtual void connectRPC(bool reconnect=false)=0; - - std::string m_addressTable; ///< FILLME - std::string m_deviceBaseNode; ///< FILLME std::string m_deviceID; ///< FILLME // All GEMHwDevice objects should have these properties uint8_t m_crate; ///< Crate number the AMC is housed in uint8_t m_slot; ///< Slot number in the uTCA shelf the AMC is sitting in - bool knownErrorCode(std::string const& errCode) const; - }; // class GEMHwDevice } // namespace gem::hw } // namespace gem - -/* // define the consts */ -/* const unsigned gem::hw::GEMHwDevice::MAX_IPBUS_RETRIES; */ - #endif // GEM_HW_GEMHWDEVICE_H diff --git a/gemhardware/devices/include/gem/hw/devices/amc/HwGenericAMC.h b/gemhardware/devices/include/gem/hw/devices/amc/HwGenericAMC.h index 7bed8065..f52ae5e8 100644 --- a/gemhardware/devices/include/gem/hw/devices/amc/HwGenericAMC.h +++ b/gemhardware/devices/include/gem/hw/devices/amc/HwGenericAMC.h @@ -10,768 +10,693 @@ namespace gem { namespace hw { - - class HwGenericAMC : public gem::hw::GEMHwDevice - { - public: - - /** - * @struct AMCIPBusCounters FIXME UPDATE FOR V3 - * @brief This structure stores retrieved counters related to the GenericAMC IPBus transactions - */ - typedef struct AMCIPBusCounters { - uint32_t OptoHybridStrobe; ///< OptoHybridStrobe is a counter for the number of errors on the tracking data link - uint32_t OptoHybridAck ; ///< OptoHybridAck is a counter for the number of errors on the trigger data link - uint32_t TrackingStrobe ; ///< TrackingStrobe is a counter for the number of errors on the tracking data link - uint32_t TrackingAck ; ///< TrackingAck is a counter for the number of errors on the trigger data link - uint32_t CounterStrobe ; ///< CounterStrobe is a counter for the number of errors on the tracking data link - uint32_t CounterAck ; ///< CounterAck is a counter for the number of errors on the trigger data link - - AMCIPBusCounters() : - OptoHybridStrobe(0),OptoHybridAck(0), - TrackingStrobe(0),TrackingAck(0), - CounterStrobe(0),CounterAck(0) {} - void reset() { - OptoHybridStrobe=0; OptoHybridAck=0; - TrackingStrobe=0; TrackingAck=0; - CounterStrobe=0; CounterAck=0; - return; } - } AMCIPBusCounters; - - - /** - * Constructors, the preferred constructor is with a connection file and device name - * as the IP address and address table can be managed there, rather than hard coded - * Constrution from crateID and slotID uses this constructor as the back end - */ - /* HwGenericAMC(); */ - /* HwGenericAMC(std::string const& amcDevice); */ - /* HwGenericAMC(int const& crate, int const& slot, bool uhalNative=false); */ - HwGenericAMC(std::string const& amcDevice, - std::string const& connectionFile); - - HwGenericAMC(std::string const& amcDevice, - std::string const& connectionURI, - std::string const& addressTable); - - HwGenericAMC(std::string const& amcDevice, - uhal::HwInterface& uhalDevice); - - virtual ~HwGenericAMC(); - - /** - * Check if one can read/write to the registers on the GenericAMC - * @returns true if the GenericAMC is accessible - */ - virtual bool isHwConnected() override; - - /****************************/ - /** GEM system information **/ - /****************************/ - /** - * @brief Read the board ID register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system board ID (GLIB) - * or the GEM_AMC board ID - * @returns the AMC board ID as a std::string - */ - virtual std::string getBoardIDString(bool const legacy=false); - - /** - * @brief Read the board ID register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system board ID ('GLIB' as ASCII characters) - * or the GEM_AMC board ID (0xbeef as uint32_t) - * @returns the AMC board ID as 32 bit unsigned value - */ - virtual uint32_t getBoardID(bool const legacy=false); - - /** - * @brief Read the board type register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system board type (GLIB) - * or the GEM_AMC board type - * @returns the AMC board type as a std::string - */ - virtual std::string getBoardTypeString(bool const legacy=false); - - /** - * @brief Read the board type register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system board type ('GLIB' as ASCII characters) - * or the GEM_AMC board type (0xbeef as uint32_t) - * @returns the AMC board type as 32 bit unsigned value - */ - virtual uint32_t getBoardType(bool const legacy=false); - - /** - * @brief Read the system ID register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system system ID (GLIB) - * or the GEM_AMC system ID - * @returns the AMC system ID as a std::string - */ - virtual std::string getSystemIDString(bool const legacy=false); - - /** - * @brief Read the system ID register (should be reimplemented in derived HW, e.g., GLIB) - * @param legacy determines whether to read the legacy system system ID ('20v1' as ASCII characters) - * or the GEM_AMC board type (0x1 as uint32_t) - * @returns the AMC system ID as 32 bit unsigned value - */ - virtual uint32_t getSystemID(bool const legacy=false); - - /** - * @brief Check how many OptoHybrids the AMC FW can support - * @returns the number of OptoHybrid boards supported by the FW - */ - uint32_t getSupportedOptoHybrids(); - - /** - * Check if the AMC FW supports trigger links - * @returns whether or not the AMC FW supports trigger links - */ - uint32_t supportsTriggerLink(); - - /** - * Read the AMC FW register - * @param system determines whether to read the system (default) or user FW register - * @returns a string corresponding to AMC FW version - */ - virtual std::string getFirmwareVerString(bool const& system=true); - - /** - * Read the AMC FW register - * @param system determines whether to read the system (default) or user FW register - * @returns the AMC FW version as a 32 bit unsigned - */ - virtual uint32_t getFirmwareVer(bool const& system=true); - - /** - * Read the AMC FW register - * @param system determines whether to read the system (default) or user FW register - * @returns a string corresponding to the build date dd-mm-yyyy - */ - virtual std::string getFirmwareDateString(bool const& system=true); - - /** - * Read the AMC FW register - * @param system determines whether to read the system (default) or user FW register - * @returns the build date as a 32 bit unsigned - */ - virtual uint32_t getFirmwareDate(bool const& system=true); - - //user core functionality - /** - * Read the user AMC FW register - * @returns the user FW build date as a 32-bit unsigned value - * OBSOLETE in V2 AMC FW - */ - virtual uint32_t getUserFirmware(); - - /** - * Read the user AMC FW register - * @returns the user FW build date as a std::string - * OBSOLETE in V2 AMC FW - */ - virtual std::string getUserFirmwareDate(); - - private: - /** - * Connect to te RPC manager and load necessary modules - * @param `reconnect` determine if the conection should be reestablished and the modules reloaded - */ - void connectRPC(bool reconnect=false) override; - - /** - * Check if the gtx requested is known to be operational - * @param gtx GTX to be queried - * @param opMsg Operation message to append to the log message - * @returns true if the GTX is in range and active, false otherwise - */ - virtual bool linkCheck(uint8_t const& gtx, std::string const& opMsg); - - public: - /** - * Set the trigger source to the front end - * @param uint8_t mode 0 from software, 1 from TTC decoder (AMC13), 2 from both - * OBSOLETE in V2 firmware, taken care of in the OptoHybrid - * UNOBSOLETE? in V3 firmware? - */ - virtual void setTrigSource(uint8_t const& mode, uint8_t const& gtx=0x0) { return; } - - /** - * Read the front end trigger source - * @retval uint8_t 0 from GenericAMC, 1 from AMC13, 2 from both - * OBSOLETE in V2 firmware, taken care of in the OptoHybrid - * UNOBSOLETE? in V3 firmware? - */ - virtual uint8_t getTrigSource(uint8_t const& gtx=0x0) { return 0; } - - /** - * Set the S-bit source - * @param uint8_t chip - * OBSOLETE in V2 firmware - */ - virtual void setSBitSource(uint8_t const& mode, uint8_t const& gtx=0x0) { return; } - - /** - * Read the S-bit source - * @retval uint8_t which VFAT chip is sending the S-bits - * OBSOLETE in V2 firmware - */ - virtual uint8_t getSBitSource(uint8_t const& gtx=0x0) { return 0; } - - ///Counters - /** - * Get the recorded number of L1A signals received from the TTC decoder - */ - uint32_t getL1ACount() { return readReg(getDeviceBaseNode(),"TTC.CMD_COUNTERS.L1A"); } - - /** - * Get the recorded number of CalPulse signals received from the TTC decoder - */ - uint32_t getCalPulseCount() { return readReg(getDeviceBaseNode(),"TTC.CMD_COUNTERS.CALPULSE"); } - - /** - * Get the recorded number of Resync signals received from the TTC decoder - */ - uint32_t getResyncCount() { return readReg(getDeviceBaseNode(),"TTC.CMD_COUNTERS.RESYNC"); } - - /** - * Get the recorded number of BC0 signals - */ - uint32_t getBC0Count() { return readReg(getDeviceBaseNode(),"TTC.CMD_COUNTERS.BC0"); } - - ///Counter resets - - /** FIXME specific counter resets from legacy, counter resets are module wide now **/ - /** - * Reset the recorded number of L1A signals received from the TTC decoder - */ - void resetL1ACount() { return writeReg(getDeviceBaseNode(),"TTC.CTRL.CNT_RESET", 0x1); } - - /** - * Reset the recorded number of CalPulse signals received from the TTC decoder - */ - void resetCalPulseCount() { return writeReg(getDeviceBaseNode(),"TTC.CTRL.CNT_RESET", 0x1); } - - /** - * Reset the recorded number of Resync signals received from the TTC decoder - */ - void resetResyncCount() { return writeReg(getDeviceBaseNode(),"TTC.CTRL.CNT_RESET", 0x1); } - - /** - * Reset the recorded number of BC0 signals - */ - void resetBC0Count() { return writeReg(getDeviceBaseNode(),"TTC.CTRL.CNT_RESET", 0x1); } - - /** - * Read the trigger data - * @retval uint32_t returns 32 bits 6 bits for s-bits and 26 for bunch counter - */ - uint32_t readTriggerFIFO(uint8_t const& gtx); - - /** - * Empty the trigger data FIFO - */ - void flushTriggerFIFO(uint8_t const& gtx); - - /**************************/ - /** DAQ link information **/ - /**************************/ - /** - * @defgroup AMCDAQModule - */ - - - /** - * @brief Set the enable mask and enable the DAQ link - * @param enableZS enable/disable zero suppression - * @param doPhaseScan turn on/off the phase shifting during configure - * @param runType parameter - * @param relock when doing the phase shift - * @param bc0LockPSMode use the BC0 locked phase shifting mode - */ - void configureDAQModule(bool enableZS, bool doPhaseShift, uint32_t const& runType=0x0, uint32_t const& marker=0xfaac, bool relock=false, bool bc0LockPSMode=false); - - /** - * @brief Set the enable mask and enable the DAQ link - * @param enableMask 32 bit word for the 24 bit enable mask - */ - void enableDAQLink(uint32_t const& enableMask=0x1); - - /** - * @brief Set the DAQ link off and disable all inputs - */ - void disableDAQLink(); - - /** - * @brief Set the zero suppression mode (handled by the AMC) - * @param enable true means any VFAT data packet with all 0's will be suppressed - * FIXME: toggle different VFAT3 modes? - */ - void setZS(bool enable=true); - - /** - * @brief Disable zero suppression of VFAT data - */ - void disableZS() { setZS(false); }; - - /** - * @brief reset the DAQ link and write the DAV timout - * - assert RESET and then release - * - disable DAQ link - * - set each link EOE_TIMEOUT to default value - * - set DAV_TIMEOUT to supplied value - * - set TTS_OVERRIDE to supplied value - * @param davTO value to use for the DAV timeout - * @param ttsOverride value to use for the TTS override - */ - void resetDAQLink(uint32_t const& davTO=0x500, uint32_t const& ttsOverride=0x0); - - /** - * @returns Returns the 32 bit word corresponding to the DAQ link control register - */ - uint32_t getDAQLinkControl(); - - /** - * @returns Returns the 32 bit word corresponding to the DAQ link status register - */ - uint32_t getDAQLinkStatus(); - - /** - * @returns Returns true if the DAQ link is ready - */ - bool daqLinkReady(); - - /** - * @returns Returns true if the DAQ link is clock is locked - */ - bool daqClockLocked(); - - /** - * @returns Returns true if the TTC is ready - */ - bool daqTTCReady(); - - /** - * @returns Returns the current TTS state asserted by the DAQ link firmware - */ - uint8_t daqTTSState(); - - /** - * @returns Returns true if the event FIFO is almost full (70%) - */ - bool daqAlmostFull(); - - /** - * @returns Returns true if the L1A FIFO is empty (0%) - */ - bool l1aFIFOIsEmpty(); - - /** - * @returns Returns true if the L1A FIFO is almost full (70%) - */ - bool l1aFIFOIsAlmostFull(); - - /** - * @returns Returns true if the L1A FIFO is full (100%) - */ - bool l1aFIFOIsFull(); - - /** - * @returns Returns true if the L1A FIFO is underflos - */ - bool l1aFIFOIsUnderflow(); - - /** - * @returns Returns the number of events built and sent on the DAQ link - */ - uint32_t getDAQLinkEventsSent(); - - /** - * @returns Returns the curent L1AID (number of L1As received) - */ - uint32_t getDAQLinkL1AID(); - - /* /\** */ - /* * @returns Returns the curent L1A rate (in Hz) */ - /* *\/ */ - /* uint32_t getDAQLinkL1ARate(); */ - - /** - * @returns Returns - */ - uint32_t getDAQLinkDisperErrors(); - - /** - * @returns Returns - */ - uint32_t getDAQLinkNonidentifiableErrors(); - - /** - * @returns Returns the DAQ link input enable mask - */ - uint32_t getDAQLinkInputMask(); - - /** - * @returns Returns the timeout used in the event builder before closing the event and sending the (potentially incomplete) data - */ - uint32_t getDAQLinkDAVTimeout(); - - /** - * @param max is a bool specifying whether to query the max timer or the last timer - * @returns Returns the spent building an event - */ - uint32_t getDAQLinkDAVTimer(bool const& max); - - /***************************************/ - /** GTX specific DAQ link information **/ - /***************************************/ - /** - * @param gtx is the input link status to query - * @returns Returns the the 32-bit word corresponding DAQ status for the specified link - */ - // FIXME: renamed from DAQLink to LinkDAQ - uint32_t getLinkDAQStatus(uint8_t const& gtx); - - /** - * @param gtx is the input link counter to query - * @param mode specifies whether to query the corrupt VFAT count (0x0) or the event number - * @returns Returns the link counter for the specified mode - */ - // FIXME: renamed from DAQLink to LinkDAQ - uint32_t getLinkDAQCounters(uint8_t const& gtx, uint8_t const& mode); - - /** - * @param gtx is the input link status to query - * @returns Returns a block of the last 7 words received from the OH on the link specified - */ - // FIXME: renamed from DAQLink to LinkDAQ - uint32_t getLinkLastDAQBlock(uint8_t const& gtx); - - /** - * @returns Returns the timeout before the event builder FW will close the event and send the data - */ - uint32_t getDAQLinkInputTimeout(); - - /** - * @returns Returns the run type stored in the data stream - */ - uint32_t getDAQLinkRunType(); - - /** - * @returns Special run parameters 1,2,3 as a single 24 bit word - */ - uint32_t getDAQLinkRunParameters(); - - /** - * @returns Special run parameter written into data stream - */ - uint32_t getDAQLinkRunParameter(uint8_t const& parameter); - - - /** - * @brief Set DAQ link timeout - * @param value is the number of clock cycles to wait after receipt of last L1A and - * last packet received from the optical link before closing an "event" - * (in units of 160MHz clock cycles, value/4 for 40MHz clock cycles) - */ - void setDAQLinkInputTimeout(uint32_t const& value=0x100); - - /** - * @brief Special run type to be written into data stream - * @param value is the run type - */ - void setDAQLinkRunType(uint32_t const& value); - - /** - * @returns Set special run parameter to be written into data stream - * @param value is a 24 bit word to write into the run paramter portion of the GEM header - */ - void setDAQLinkRunParameters(uint32_t const& value); - - /** - * @returns Special run parameter written into data stream - * @param parameter is the number of parameter to be written (1-3) - * @param value is the run paramter to write into the specified parameter - */ - void setDAQLinkRunParameter(uint8_t const& parameter, uint8_t const& value); - - - /**************************/ - /** TTC module information **/ - /**************************/ - /** - * @defgroup AMCTTCModule - */ - - /*** CTRL submodule ***/ - /** - * @brief Reset the TTC module - */ - void ttcModuleReset(); - - /** - * @brief Reset the MMCM of the TTC module - */ - void ttcMMCMReset(); - - /** - * @brief Shift the phase of the MMCM of the TTC module - * @param relock to shift of lock before looking for a good lock - * @param modeBC0 to determine the good phase region, rather than the PLL lock status - * @param scan whether to roll around multiple times for monitoring purposes - */ - void ttcMMCMPhaseShift(bool relock=false, bool modeBC0=false, bool scan=false); - - /** - * @brief Check the lock status of the MMCM PLL - * @param Number of times to read the PLL lock status - * @returns Lock count of the MMCM PLL - */ - int checkPLLLock(uint32_t readAttempts); - - /** - * @brief Check the phase mean of the MMCM PLL - * @param Number of times to read the phase mean - * * 0 reads means take the mean calculated in FW - * * 1+ reads means take the mean of the specified reads of the phase directly - * @returns Mean value of the MMCH phase - */ - double getMMCMPhaseMean(uint32_t readAttempts); - - /** - * @brief Check the phase median of the MMCM PLL - * @param Number of times to read the phase and compute the median - * @returns Median value of the MMCH phase - */ - double getMMCMPhaseMedian(uint32_t readAttempts); - - /** - * @brief Check the phase mean of the GTH PLL - * @param Number of times to read the phase mean - * * 0 reads means take the mean calculated in FW - * * 1+ reads means take the mean of the specified reads of the phase directly - * @returns Mean value of the GTH phase - */ - double getGTHPhaseMean(uint32_t readAttempts); - - /** - * @brief Check the phase median of the GTH PLL - * @param Number of times to read the phase and compute the median - * @returns Median value of the MMCH phase - */ - double getGTHPhaseMedian(uint32_t readAttempts); - - /** - * @brief Reset the counters of the TTC module - */ - virtual void ttcCounterReset(); - - /** - * @returns whether or not L1As are currently enabled on the GenericAMC - */ - virtual bool getL1AEnable(); - - /** - * @param whether or not to enable L1As on the GenericAMC - */ - virtual void setL1AEnable(bool enable=true); - - /*** CONFIG submodule ***/ - /** - * @param cmd AMCTTCCommandT enum type to retrieve the current configuration of - * @returns TTC configuration register values - */ - virtual uint32_t getTTCConfig(AMCTTCCommandT const& cmd); - - /** - * @param cmd AMCTTCCommandT to set the current configuration of - */ - virtual void setTTCConfig(AMCTTCCommandT const& cmd, uint8_t const& value); - - /*** STATUS submodule ***/ - /** - * @brief Returns the first status register of the TTC module - */ - virtual uint32_t getTTCStatus(); - - /** - * @brief Returns the error count of the TTC module - * @param specify whether single or double error count - */ - virtual uint32_t getTTCErrorCount(bool const& single=true); - - /*** CMD_COUNTERS submodule ***/ - /** - * @param cmd AMCTTCCommandT to get the current configuration of - * @returns Returns the counter for the specified TTC command - */ - virtual uint32_t getTTCCounter(AMCTTCCommandT const& cmd); - - /** - * @returns Returns the L1A ID received by the TTC module - */ - virtual uint32_t getL1AID(); - - /** - * @returns Returns the curent L1A rate (in Hz) - */ - virtual uint32_t getL1ARate(); - - /** - * @returns 32-bit word corresponding to the 8 most recent TTC commands received - */ - virtual uint32_t getTTCSpyBuffer(); - - /**************************/ - /** SLOW_CONTROL module information **/ - /**************************/ - - /*** SCA submodule ***/ - /** - * @brief Enable the SCA to forward HardReset to the OptoHybrid - * @param bool switches on/off the HardReset forwarding (default is false) - */ - virtual void scaHardResetEnable(bool const& en=false); - - /********************************/ - /** TRIGGER module information **/ - /********************************/ - - /*** CTRL submodule ***/ - /** - * @brief Reset the TRIGGER module - */ - virtual void triggerReset(); - - /** - * @brief Reset the counters of the TRIGGER module - */ - virtual void triggerCounterReset(); - - /** - * @brief Reset the counters of the TRIGGER module - * @returns the mask for which OHs will have their sbits blocked - */ - virtual uint32_t getOptoHybridKillMask(); - - /** - * @brief Reset the counters of the TRIGGER module - * @param mask of which OptoHybrids will have their sbits blocked - */ - virtual void setOptoHybridKillMask(uint32_t const& mask); - - /*** STATUS submodule ***/ - /** - * @brief Returns the first status register of the TRIGGER module - */ - virtual uint32_t getORTriggerRate(); - - /** - * @brief Returns the error count of the TRIGGER module - * @param specify whether single or double error count - */ - virtual uint32_t getORTriggerCount(); - - /*** OH{IDXX} submodule ***/ - /** - * @brief Returns the first status register of the TRIGGER module - * @param OptoHybrid to obtain the rate for - * @returns Rate of the triggers seen - */ - virtual uint32_t getOptoHybridTriggerRate(uint8_t const& oh); - - /** - * @brief Returns the error count of the TRIGGER module - * @param OptoHybrid to obtain the count for - * @returns Count of the triggers seen - */ - virtual uint32_t getOptoHybridTriggerCount(uint8_t const& oh); - - /** - * @brief Returns the rate of seen sbit clusters of a given size from a specific OptoHybrid - * @param OptoHybrid to obtain the rate for - * @param Cluster size to return the rate for - * @returns Rate of the sbits for a specified cluster size - */ - virtual uint32_t getOptoHybridClusterRate(uint8_t const& oh, uint8_t const& cs); - - /** - * @brief Returns the count of seen sbit clusters of a given size from a specific OptoHybrid - * @param OptoHybrid to obtain the count for - * @param Cluster size to return the count for - * @returns Count of the sbits for a specified cluster size - */ - virtual uint32_t getOptoHybridClusterCount(uint8_t const& oh, uint8_t const& cs); - - /** - * @brief Returns the last cluster of seen sbit clusters of a given size from a specific OptoHybrid - * @param OptoHybrid to obtain the last cluster for - * @param Cluster size to return the last cluster for - * @returns Last cluster of specified size - */ - virtual uint32_t getOptoHybridDebugLastCluster(uint8_t const& oh, uint8_t const& cs); - - /** - * @brief Returns the count of seen sbit clusters of a given size from a specific OptoHybrid - * @param OptoHybrid to obtain the count for - * @param Link size to return the count for - * @param Which counter to query - * @returns Count of the sbits for a specified cluster size - */ - virtual uint32_t getOptoHybridTriggerLinkCount(uint8_t const& oh, uint8_t const& link, AMCOHLinkCountT const& count); - - /****************************/ - /** DAQ moudle information **/ - /****************************/ - /** - * @brief performs a general reset of the GenericAMC - */ - virtual void generalReset(); - - /** - * @brief performs a reset of the GenericAMC counters - */ - virtual void counterReset(); - - /** - * @brief performs a reset of the GenericAMC T1 counters - */ - virtual void resetT1Counters(); - - /** - * @brief performs a reset of the GenericAMC GTX link counters - */ - virtual void linkCounterReset(); - - /** - * @brief performs a reset of the GenericAMC link - * @param link is the link to perform the reset on - */ - virtual void linkReset(uint8_t const& link); - - std::vector m_ipBusCounters; /** for each gtx, IPBus counters */ - - protected: - uint32_t m_links; ///< Connected links mask - uint32_t m_maxLinks; ///< Maximum supported OptoHybrids as reported by the firmware - - /** - * @brief sets the expected board ID string to be matched when reading from the firmware - * @param boardID is the expected board ID - */ - void setExpectedBoardID(std::string const& boardID) { m_boardID = boardID; } - - std::string m_boardID; ///< expected boardID in the firmware - - private: - // Do not use default constructor. HwGenericAMC object should only be made using - // either connection file method or with a list of URIs and address tables - HwGenericAMC(); - - // Prevent copying of HwGenericAMC objects - HwGenericAMC(const HwGenericAMC& other); // prevents construction-copy - HwGenericAMC& operator=(const HwGenericAMC&); // prevents copying - - }; // class HwGenericAMC + namespace amc { + class HwGenericAMC : public gem::hw::GEMHwDevice + { + public: + + /** + * Constructor, uses IP resolvable device name + */ + HwGenericAMC(std::string const& amcDevice); + + virtual ~HwGenericAMC(); + + /** + * Check if one can read/write to the registers on the GenericAMC + * @returns true if the GenericAMC is accessible + */ + virtual bool isHwConnected() override; + + /****************************/ + /** GEM system information **/ + /****************************/ + /** + * @brief Read the board ID register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC board ID as a std::string + */ + std::string getBoardIDString(); + + /** + * @brief Read the board ID register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC board ID as 32 bit unsigned value + */ + uint32_t getBoardID(); + + /** + * @brief Read the board type register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC board type as a std::string + */ + std::string getBoardTypeString(); + + /** + * @brief Read the board type register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC board type as 32 bit unsigned value + */ + uint32_t getBoardType(); + + /** + * @brief Read the system ID register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC system ID as a std::string + */ + std::string getSystemIDString(); + + /** + * @brief Read the system ID register (should be reimplemented in derived HW, e.g., GLIB) + * @returns the AMC system ID as 32 bit unsigned value + */ + uint32_t getSystemID(); + + /** + * @brief Check how many OptoHybrids the AMC FW can support + * @returns the number of OptoHybrid boards supported by the FW + */ + uint32_t getSupportedOptoHybrids(); + + /** + * Check if the AMC FW supports trigger links + * @returns whether or not the AMC FW supports trigger links + */ + uint32_t supportsTriggerLink(); + + /** + * Read the AMC FW register + * @param system determines whether to read the system (default) or user FW register + * @returns a string corresponding to AMC FW version + */ + std::string getFirmwareVerString(bool const& system=true); + + /** + * Read the AMC FW register + * @param system determines whether to read the system (default) or user FW register + * @returns the AMC FW version as a 32 bit unsigned + */ + uint32_t getFirmwareVer(bool const& system=true); + + /** + * Read the AMC FW register + * @param system determines whether to read the system (default) or user FW register + * @returns a string corresponding to the build date dd-mm-yyyy + */ + std::string getFirmwareDateString(bool const& system=true); + + /** + * Read the AMC FW register + * @param system determines whether to read the system (default) or user FW register + * @returns the build date as a 32 bit unsigned + */ + uint32_t getFirmwareDate(bool const& system=true); + + //user core functionality + /** + * Read the user AMC FW register + * @returns the user FW build date as a 32-bit unsigned value + * OBSOLETE in V2 AMC FW + */ + uint32_t getUserFirmware(); + + /** + * Read the user AMC FW register + * @returns the user FW build date as a std::string + * OBSOLETE in V2 AMC FW + */ + std::string getUserFirmwareDate(); + + private: + /** + * Connect to te RPC manager and load necessary modules + * @param `reconnect` determine if the conection should be reestablished and the modules reloaded + */ + void connectRPC(bool reconnect=false) override; + + /** + * Check if the gtx requested is known to be operational + * @param gtx GTX to be queried + * @param opMsg Operation message to append to the log message + * @returns true if the GTX is in range and active, false otherwise + */ + virtual bool linkCheck(uint8_t const& gtx, std::string const& opMsg); + + public: + /** + * Set the trigger source to the front end + * @param uint8_t mode 0 from software, 1 from TTC decoder (AMC13), 2 from both + * OBSOLETE in V2 firmware, taken care of in the OptoHybrid + * UNOBSOLETE? in V3 firmware? + */ + virtual void setTrigSource(uint8_t const& mode, uint8_t const& gtx=0x0) { return; } + + /** + * Read the front end trigger source + * @retval uint8_t 0 from GenericAMC, 1 from AMC13, 2 from both + * OBSOLETE in V2 firmware, taken care of in the OptoHybrid + * UNOBSOLETE? in V3 firmware? + */ + virtual uint8_t getTrigSource(uint8_t const& gtx=0x0) { return 0; } + + /** + * Set the S-bit source + * @param uint8_t chip + * OBSOLETE in V2 firmware + */ + virtual void setSBitSource(uint8_t const& mode, uint8_t const& gtx=0x0) { return; } + + /** + * Read the S-bit source + * @retval uint8_t which VFAT chip is sending the S-bits + * OBSOLETE in V2 firmware + */ + virtual uint8_t getSBitSource(uint8_t const& gtx=0x0) { return 0; } + + ///Counters + /** + * Get the recorded number of L1A signals received from the TTC decoder + */ + uint32_t getL1ACount() { return readReg("GEM_AMC.TTC.CMD_COUNTERS.L1A"); } + + /** + * Get the recorded number of CalPulse signals received from the TTC decoder + */ + uint32_t getCalPulseCount() { return readReg("GEM_AMC.TTC.CMD_COUNTERS.CALPULSE"); } + + /** + * Get the recorded number of Resync signals received from the TTC decoder + */ + uint32_t getResyncCount() { return readReg("GEM_AMC.TTC.CMD_COUNTERS.RESYNC"); } + + /** + * Get the recorded number of BC0 signals + */ + uint32_t getBC0Count() { return readReg("GEM_AMC.TTC.CMD_COUNTERS.BC0"); } + + ///Counter resets + + /** + * Read the trigger data + * @retval uint32_t returns 32 bits 6 bits for s-bits and 26 for bunch counter + */ + uint32_t readTriggerFIFO(uint8_t const& gtx); + + /** + * Empty the trigger data FIFO + */ + void flushTriggerFIFO(uint8_t const& gtx); + + /**************************/ + /** DAQ link information **/ + /**************************/ + /** + * @defgroup AMCDAQModule + */ + + + /** + * @brief Set the enable mask and enable the DAQ link + * @param enableZS enable/disable zero suppression + * @param doPhaseScan turn on/off the phase shifting during configure + * @param runType parameter + * @param relock when doing the phase shift + * @param bc0LockPSMode use the BC0 locked phase shifting mode + */ + void configureDAQModule(bool enableZS, bool doPhaseShift, uint32_t const& runType=0x0, uint32_t const& marker=0xfaac, bool relock=false, bool bc0LockPSMode=false); + + /** + * @brief Set the enable mask and enable the DAQ link + * @param enableMask 32 bit word for the 24 bit enable mask + */ + void enableDAQLink(uint32_t const& enableMask=0x1); + + /** + * @brief Set the DAQ link off and disable all inputs + */ + void disableDAQLink(); + + /** + * @brief Set the zero suppression mode (handled by the AMC) + * @param enable true means any VFAT data packet with all 0's will be suppressed + * FIXME: toggle different VFAT3 modes? + */ + void setZS(bool enable=true); + + /** + * @brief Disable zero suppression of VFAT data + */ + void disableZS() { setZS(false); }; + + /** + * @brief reset the DAQ link and write the DAV timout + * - assert RESET and then release + * - disable DAQ link + * - set each link EOE_TIMEOUT to default value + * - set DAV_TIMEOUT to supplied value + * - set TTS_OVERRIDE to supplied value + * @param davTO value to use for the DAV timeout + * @param ttsOverride value to use for the TTS override + */ + void resetDAQLink(uint32_t const& davTO=0x500, uint32_t const& ttsOverride=0x0); + + /** + * @returns Returns the 32 bit word corresponding to the DAQ link control register + */ + uint32_t getDAQLinkControl(); + + /** + * @returns Returns the 32 bit word corresponding to the DAQ link status register + */ + uint32_t getDAQLinkStatus(); + + /** + * @returns Returns true if the DAQ link is ready + */ + bool daqLinkReady(); + + /** + * @returns Returns true if the DAQ link is clock is locked + */ + bool daqClockLocked(); + + /** + * @returns Returns true if the TTC is ready + */ + bool daqTTCReady(); + + /** + * @returns Returns the current TTS state asserted by the DAQ link firmware + */ + uint8_t daqTTSState(); + + /** + * @returns Returns true if the event FIFO is almost full (70%) + */ + bool daqAlmostFull(); + + /** + * @returns Returns true if the L1A FIFO is empty (0%) + */ + bool l1aFIFOIsEmpty(); + + /** + * @returns Returns true if the L1A FIFO is almost full (70%) + */ + bool l1aFIFOIsAlmostFull(); + + /** + * @returns Returns true if the L1A FIFO is full (100%) + */ + bool l1aFIFOIsFull(); + + /** + * @returns Returns true if the L1A FIFO is underflos + */ + bool l1aFIFOIsUnderflow(); + + /** + * @returns Returns the number of events built and sent on the DAQ link + */ + uint32_t getDAQLinkEventsSent(); + + /** + * @returns Returns the curent L1AID (number of L1As received) + */ + uint32_t getDAQLinkL1AID(); + + /* /\** */ + /* * @returns Returns the curent L1A rate (in Hz) */ + /* *\/ */ + /* uint32_t getDAQLinkL1ARate(); */ + + /** + * @returns Returns + */ + uint32_t getDAQLinkDisperErrors(); + + /** + * @returns Returns + */ + uint32_t getDAQLinkNonidentifiableErrors(); + + /** + * @returns Returns the DAQ link input enable mask + */ + uint32_t getDAQLinkInputMask(); + + /** + * @returns Returns the timeout used in the event builder before closing the event and sending the (potentially incomplete) data + */ + uint32_t getDAQLinkDAVTimeout(); + + /** + * @param max is a bool specifying whether to query the max timer or the last timer + * @returns Returns the spent building an event + */ + uint32_t getDAQLinkDAVTimer(bool const& max); + + /***************************************/ + /** GTX specific DAQ link information **/ + /***************************************/ + /** + * @param gtx is the input link status to query + * @returns Returns the the 32-bit word corresponding DAQ status for the specified link + */ + // FIXME: renamed from DAQLink to LinkDAQ + uint32_t getLinkDAQStatus(uint8_t const& gtx); + + /** + * @param gtx is the input link counter to query + * @param mode specifies whether to query the corrupt VFAT count (0x0) or the event number + * @returns Returns the link counter for the specified mode + */ + // FIXME: renamed from DAQLink to LinkDAQ + uint32_t getLinkDAQCounters(uint8_t const& gtx, uint8_t const& mode); + + /** + * @param gtx is the input link status to query + * @returns Returns a block of the last 7 words received from the OH on the link specified + */ + // FIXME: renamed from DAQLink to LinkDAQ + uint32_t getLinkLastDAQBlock(uint8_t const& gtx); + + /** + * @returns Returns the timeout before the event builder FW will close the event and send the data + */ + uint32_t getDAQLinkInputTimeout(); + + /** + * @returns Returns the run type stored in the data stream + */ + uint32_t getDAQLinkRunType(); + + /** + * @returns Special run parameters 1,2,3 as a single 24 bit word + */ + uint32_t getDAQLinkRunParameters(); + + /** + * @returns Special run parameter written into data stream + */ + uint32_t getDAQLinkRunParameter(uint8_t const& parameter); + + + /** + * @brief Set DAQ link timeout + * @param value is the number of clock cycles to wait after receipt of last L1A and + * last packet received from the optical link before closing an "event" + * (in units of 160MHz clock cycles, value/4 for 40MHz clock cycles) + */ + void setDAQLinkInputTimeout(uint32_t const& value=0x100); + + /** + * @brief Special run type to be written into data stream + * @param value is the run type + */ + void setDAQLinkRunType(uint32_t const& value); + + /** + * @returns Set special run parameter to be written into data stream + * @param value is a 24 bit word to write into the run paramter portion of the GEM header + */ + void setDAQLinkRunParameters(uint32_t const& value); + + /** + * @returns Special run parameter written into data stream + * @param parameter is the number of parameter to be written (1-3) + * @param value is the run paramter to write into the specified parameter + */ + void setDAQLinkRunParameter(uint8_t const& parameter, uint8_t const& value); + + + /**************************/ + /** TTC module information **/ + /**************************/ + /** + * @defgroup AMCTTCModule + */ + + /*** CTRL submodule ***/ + /** + * @brief Reset the TTC module + */ + void ttcModuleReset(); + + /** + * @brief Reset the MMCM of the TTC module + */ + void ttcMMCMReset(); + + /** + * @brief Shift the phase of the MMCM of the TTC module + * @param relock to shift of lock before looking for a good lock + * @param modeBC0 to determine the good phase region, rather than the PLL lock status + * @param scan whether to roll around multiple times for monitoring purposes + */ + void ttcMMCMPhaseShift(bool relock=false, bool modeBC0=false, bool scan=false); + + /** + * @brief Check the lock status of the MMCM PLL + * @param Number of times to read the PLL lock status + * @returns Lock count of the MMCM PLL + */ + int checkPLLLock(uint32_t readAttempts); + + /** + * @brief Check the phase mean of the MMCM PLL + * @param Number of times to read the phase mean + * * 0 reads means take the mean calculated in FW + * * 1+ reads means take the mean of the specified reads of the phase directly + * @returns Mean value of the MMCH phase + */ + double getMMCMPhaseMean(uint32_t readAttempts); + + /** + * @brief Check the phase median of the MMCM PLL + * @param Number of times to read the phase and compute the median + * @returns Median value of the MMCH phase + */ + double getMMCMPhaseMedian(uint32_t readAttempts); + + /** + * @brief Check the phase mean of the GTH PLL + * @param Number of times to read the phase mean + * * 0 reads means take the mean calculated in FW + * * 1+ reads means take the mean of the specified reads of the phase directly + * @returns Mean value of the GTH phase + */ + double getGTHPhaseMean(uint32_t readAttempts); + + /** + * @brief Check the phase median of the GTH PLL + * @param Number of times to read the phase and compute the median + * @returns Median value of the MMCH phase + */ + double getGTHPhaseMedian(uint32_t readAttempts); + + /** + * @brief Reset the counters of the TTC module + */ + virtual void ttcCounterReset(); + + /** + * @returns whether or not L1As are currently enabled on the GenericAMC + */ + virtual bool getL1AEnable(); + + /** + * @param whether or not to enable L1As on the GenericAMC + */ + virtual void setL1AEnable(bool enable=true); + + /*** CONFIG submodule ***/ + /** + * @param cmd AMCTTCCommandT enum type to retrieve the current configuration of + * @returns TTC configuration register values + */ + virtual uint32_t getTTCConfig(AMCTTCCommandT const& cmd); + + /** + * @param cmd AMCTTCCommandT to set the current configuration of + */ + virtual void setTTCConfig(AMCTTCCommandT const& cmd, uint8_t const& value); + + /*** STATUS submodule ***/ + /** + * @brief Returns the first status register of the TTC module + */ + virtual uint32_t getTTCStatus(); + + /** + * @brief Returns the error count of the TTC module + * @param specify whether single or double error count + */ + virtual uint32_t getTTCErrorCount(bool const& single=true); + + /*** CMD_COUNTERS submodule ***/ + /** + * @param cmd AMCTTCCommandT to get the current configuration of + * @returns Returns the counter for the specified TTC command + */ + virtual uint32_t getTTCCounter(AMCTTCCommandT const& cmd); + + /** + * @returns Returns the L1A ID received by the TTC module + */ + virtual uint32_t getL1AID(); + + /** + * @returns Returns the curent L1A rate (in Hz) + */ + virtual uint32_t getL1ARate(); + + /** + * @returns 32-bit word corresponding to the 8 most recent TTC commands received + */ + virtual uint32_t getTTCSpyBuffer(); + + /**************************/ + /** SLOW_CONTROL module information **/ + /**************************/ + + /*** SCA submodule ***/ + /** + * @brief Enable the SCA to forward HardReset to the OptoHybrid + * @param bool switches on/off the HardReset forwarding (default is false) + */ + virtual void scaHardResetEnable(bool const& en=false); + + /********************************/ + /** TRIGGER module information **/ + /********************************/ + + /*** CTRL submodule ***/ + /** + * @brief Reset the TRIGGER module + */ + virtual void triggerReset(); + + /** + * @brief Reset the counters of the TRIGGER module + */ + virtual void triggerCounterReset(); + + /** + * @brief Reset the counters of the TRIGGER module + * @returns the mask for which OHs will have their sbits blocked + */ + virtual uint32_t getOptoHybridKillMask(); + + /** + * @brief Reset the counters of the TRIGGER module + * @param mask of which OptoHybrids will have their sbits blocked + */ + virtual void setOptoHybridKillMask(uint32_t const& mask); + + /*** STATUS submodule ***/ + /** + * @brief Returns the first status register of the TRIGGER module + */ + virtual uint32_t getORTriggerRate(); + + /** + * @brief Returns the error count of the TRIGGER module + * @param specify whether single or double error count + */ + virtual uint32_t getORTriggerCount(); + + /*** OH{IDXX} submodule ***/ + /** + * @brief Returns the first status register of the TRIGGER module + * @param OptoHybrid to obtain the rate for + * @returns Rate of the triggers seen + */ + virtual uint32_t getOptoHybridTriggerRate(uint8_t const& oh); + + /** + * @brief Returns the error count of the TRIGGER module + * @param OptoHybrid to obtain the count for + * @returns Count of the triggers seen + */ + virtual uint32_t getOptoHybridTriggerCount(uint8_t const& oh); + + /** + * @brief Returns the rate of seen sbit clusters of a given size from a specific OptoHybrid + * @param OptoHybrid to obtain the rate for + * @param Cluster size to return the rate for + * @returns Rate of the sbits for a specified cluster size + */ + virtual uint32_t getOptoHybridClusterRate(uint8_t const& oh, uint8_t const& cs); + + /** + * @brief Returns the count of seen sbit clusters of a given size from a specific OptoHybrid + * @param OptoHybrid to obtain the count for + * @param Cluster size to return the count for + * @returns Count of the sbits for a specified cluster size + */ + virtual uint32_t getOptoHybridClusterCount(uint8_t const& oh, uint8_t const& cs); + + /** + * @brief Returns the last cluster of seen sbit clusters of a given size from a specific OptoHybrid + * @param OptoHybrid to obtain the last cluster for + * @param Cluster size to return the last cluster for + * @returns Last cluster of specified size + */ + virtual uint32_t getOptoHybridDebugLastCluster(uint8_t const& oh, uint8_t const& cs); + + /** + * @brief Returns the count of seen sbit clusters of a given size from a specific OptoHybrid + * @param OptoHybrid to obtain the count for + * @param Link size to return the count for + * @param Which counter to query + * @returns Count of the sbits for a specified cluster size + */ + virtual uint32_t getOptoHybridTriggerLinkCount(uint8_t const& oh, uint8_t const& link, AMCOHLinkCountT const& count); + + /****************************/ + /** DAQ moudle information **/ + /****************************/ + /** + * @brief performs a general reset of the GenericAMC + */ + virtual void generalReset(); + + /** + * @brief performs a reset of the GenericAMC counters + */ + //FIXME not implemented + virtual void counterReset(){} + + /** + * @brief performs a reset of the GenericAMC GTX link counters + */ + //FIXME not implemented virtual void linkCounterReset(); + + /** + * @brief performs a reset of the GenericAMC link + * @param link is the link to perform the reset on + */ + virtual void linkReset(uint8_t const& link); + + protected: + uint32_t m_links; ///< Connected links mask + uint32_t m_maxLinks; ///< Maximum supported OptoHybrids as reported by the firmware + + /** + * @brief sets the expected board ID string to be matched when reading from the firmware + * @param boardID is the expected board ID + */ + void setExpectedBoardID(std::string const& boardID) { m_boardID = boardID; } + + std::string m_boardID; ///< expected boardID in the firmware + + private: + // Do not use default constructor. HwGenericAMC object should only be made using + // either connection file method or with a list of URIs and address tables + HwGenericAMC(); + + // Prevent copying of HwGenericAMC objects + HwGenericAMC(const HwGenericAMC& other); // prevents construction-copy + HwGenericAMC& operator=(const HwGenericAMC&); // prevents copying + + }; // class HwGenericAMC + } // namespace gem::hw::amc } // namespace gem::hw } // namespace gem diff --git a/gemhardware/devices/include/gem/hw/devices/glib/GLIBSettingsEnums.h b/gemhardware/devices/include/gem/hw/devices/glib/GLIBSettingsEnums.h deleted file mode 100644 index 67703fb1..00000000 --- a/gemhardware/devices/include/gem/hw/devices/glib/GLIBSettingsEnums.h +++ /dev/null @@ -1,95 +0,0 @@ -/** @file GLIBSettingsEnums.h */ - -#ifndef GEM_HW_GLIB_GLIBSETTINGSENUMS_H -#define GEM_HW_GLIB_GLIBSETTINGSENUMS_H - -namespace gem { - namespace hw { - namespace glib { - class GLIBLinkSettings - { - public: - struct LinkBitMasks { - enum ELinkBitMasks { - ERROR = 0x01, - RECI2C = 0x02, - SNTI2C = 0x04, - RECREG = 0x08, - SNTREG = 0x10, - } LinkBitMasks; - }; - - struct LinkBitShifts { - enum ELinkBitShifts { - ERROR = 0, - RECI2C = 1, - SNTI2C = 2, - RECREG = 3, - SNTREG = 4, - } LinkBitShifts; - }; - }; - - class GLIBSettings { - public: - - //what are these for the GLIB?? - struct ContRegBitMasks { - enum EContRegBitMasks { - //Control Register 0 - RUNMODE = 0x01, - TRIGMODE = 0x0e, - MSPOL = 0x10, - CALPOL = 0x20, - CALMODE = 0xc0, - } ContRegBitMasks; - }; - - struct ContRegBitShifts { - enum EContRegBitShifts { - //Control Register 0 - RUNMODE = 0, - TRIGMODE = 1, - MSPOL = 4, - CALPOL = 5, - CALMODE = 6, - } ContRegBitShifts; - }; - - struct RunMode { //defines the run mode - enum ERunMode { //defines the run mode - SLEEP = 0x0, //sleep (default) - RUN = 0x1 //running - } RunMode; - }; - - struct TriggerMode { //Trigger mode settings - enum ETriggerMode { //Trigger mode settings - GLIB = 0x0, //Triggers are generated internally - TTC = 0x1, //Triggers come from the TTC link on the backplane - BOTH = 0x2, //Use all sources of triggers - } TriggerMode; - }; - - struct TTCEncoding { //TTCEncoding settings - enum ETTCEncoding { //TTCEncoding settings - AMC13 = 0x0, //Use the AMC13 style TTC encoding - GEMCSC = 0x1, //Use the CSC/GEM style TTC encoding - } TTCEncoding; - }; - - }; // class GLIBSettings - } // namespace gem::hw::glib - } // namespace gem::hw - - //typedef the struct for access to the members via struct::VALUE - typedef gem::hw::glib::GLIBLinkSettings::LinkBitMasks GLIBLinkBitMasks; - typedef gem::hw::glib::GLIBLinkSettings::LinkBitShifts GLIBLinkBitShifts; - - //typedef the enum for casting and access - typedef gem::hw::glib::GLIBSettings::RunMode::ERunMode GLIBRunMode; - typedef gem::hw::glib::GLIBSettings::TriggerMode::ETriggerMode GLIBTrigMode; - typedef gem::hw::glib::GLIBSettings::TTCEncoding::ETTCEncoding GLIBTTCEncoding; -} // namespace gem - -#endif // GEM_HW_GLIB_GLIBSETTINGSENUMS_H diff --git a/gemhardware/devices/include/gem/hw/devices/glib/HwGLIB.h b/gemhardware/devices/include/gem/hw/devices/glib/HwGLIB.h deleted file mode 100644 index cc6c0107..00000000 --- a/gemhardware/devices/include/gem/hw/devices/glib/HwGLIB.h +++ /dev/null @@ -1,401 +0,0 @@ -/** @file HwGLIB.h */ - -#ifndef GEM_HW_GLIB_HWGLIB_H -#define GEM_HW_GLIB_HWGLIB_H - -#include "gem/hw/devices/amc/HwGenericAMC.h" - -#include "gem/hw/devices/glib/GLIBSettingsEnums.h" - -namespace gem { - namespace hw { - namespace glib { - - //class GLIBMonitor; - - class HwGLIB: public gem::hw::HwGenericAMC - { - public: - - /** - * Constructors, the preferred constructor is with a connection file and device name - * as the IP address and address table can be managed there, rather than hard coded - * Constrution from crateID and slotID uses this constructor as the back end - */ - /* HwGLIB(); */ - HwGLIB(std::string const& glibDevice, std::string const& connectionFile); - HwGLIB(std::string const& glibDevice, std::string const& connectionURI, - std::string const& addressTable); - HwGLIB(std::string const& glibDevice, uhal::HwInterface& uhalDevice); - /* HwGLIB(int const& crate, int const& slot); */ - - virtual ~HwGLIB(); - - /** - * Connect to te RPC manager and load necessary modules - * @param reconnect determine if the conection should be reestablished and the modules reloaded - void connectRPC(bool reconnect=false) override; - */ - - /** - * Check if one can read/write to the registers on the GLIB - * @returns true if the GLIB is accessible - bool isHwConnected(); - */ - - //system core functionality - /** - * Read the board ID registers - * @returns the GLIB board ID - */ - std::string getBoardIDString(); - - /** - * Read the board ID registers - * @returns the GLIB board ID as 32 bit unsigned - */ - uint32_t getBoardID(); - - /** - * Read the system information register - * @returns a string corresponding to the system ID - */ - std::string getSystemIDString(); - - /** - * Read the system information register - * @returns a string corresponding to the system ID as 32 bit unsigned - */ - uint32_t getSystemID(); - - /** - * Read the IP address register - * @returns a string corresponding to the dotted quad IP address of the board - */ - std::string getIPAddressString(); - - /** - * Read the IP address register - * @returns the IP address of the board as a 32 bit unsigned - */ - uint32_t getIPAddress(); - - /** - * Read the MAC address register - * @returns a string corresponding to the MAC address of the board - */ - std::string getMACAddressString(); - - /** - * Read the MAC address register - * @returns the MAC address of the board as a 64 bit unsigned - */ - uint64_t getMACAddress(); - - //external clocking control functions - /** - * control the PCIe clock - * @param factor 0 -> OUT = 2.5xIN, 1 -> OUT = 1.25xIN - * @param reset 1 -> reset, 0 -> normal operation - * @param enable 0 -> disabled, 1 -> enabled - * void controlPCIe(uint8_t const& factor); - */ - - /** - * select the PCIe clock multiplier - * @param factor 0 -> OUT = 2.5xIN, 1 -> OUT = 1.25xIN - */ - void PCIeClkFSel(uint8_t const& factor) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_FSEL",(uint32_t)factor); - }; - - /** - * get the PCIe clock multiplier - * @returns the clock multiplier 0 -> OUT = 2.5xIN, 1 -> OUT = 1.25xIN - */ - uint8_t PCIeClkFSel() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_FSEL"); - }; - - /** - * send master reset to the PCIe clock - * @param reset 1 -> reset, 0 -> normal operation - */ - void PCIeClkMaster(bool reset) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_MR",(uint32_t)reset); - }; - - /** - * get the PCIe clock reset state - * @returns the clock reset state 0 -> normal mode, 1 -> reset - */ - uint8_t PCIeClkMaster() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_MR"); - }; - - /** - * enable the PCIe clock output - * @param enable 0 -> disabled, 1 -> enabled - */ - void PCIeClkOutput(bool enable) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_OE",(uint32_t)enable); - }; - - /** - * get the PCIe clock output status - * @returns the clock output status 0 -> disabled, 1 -> enabled - */ - uint8_t PCIeClkOutput() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"PCIE_CLK_OE"); - }; - - - /** - * enable the CDCE - * @param powerup 0 -> power down, 1 -> power up - */ - void CDCEPower(bool powerup) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"CDCE_POWERUP",(uint32_t)powerup); - }; - - /** - * get the CDCE clock output status - * @returns the clock output status 0 -> disabled, 1 -> enabled - */ - uint8_t CDCEPower() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"CDCE_POWERUP"); - }; - - /** - * select the CDCE reference clock - * @param refsrc 0 -> CLK1, 1 -> CLK2 - */ - void CDCEReference(bool refsrc) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"CDCE_REFSEL",(uint32_t)refsrc); - }; - - /** - * get the CDCE reference clock - * @returns the reference clock status 0 -> CLK1, 1 -> CLK2 - */ - uint8_t CDCEReference() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"CDCE_REFSEL"); - }; - - /** - * resync the CDCE requires a transition from 0 to 1 - * @param powerup 0 -> power down, 1 -> power up - */ - void CDCESync(bool sync) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - if (sync) { - writeReg(getDeviceBaseNode(),regName.str()+"CDCE_SYNC",0x0); - writeReg(getDeviceBaseNode(),regName.str()+"CDCE_SYNC",0x1); - } - }; - - /** - * get the CDCE syncronization status - * @returns the cdce sync status 0 -> disabled, 1 -> enabled - */ - uint8_t CDCESync() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"CDCE_SYNC"); - }; - - /** - * choose who controls the CDCE - * @param source 0 -> system firmware, 1 -> user firmware - */ - void CDCEControl(bool source) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"CDCE_CTRLSEL",(uint32_t)source); - }; - - /** - * get the CDCE clock output status - * @returns the cdce control status 0 -> system firmware, 1 -> user firmware - */ - uint8_t CDCEControl() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"CDCE_CTRLSEL"); - }; - - - /** - * enable TClkB output to the backplane - * @param enable 0 -> disabled, 1 -> enabled - */ - void TClkBOutput(bool enable) { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - writeReg(getDeviceBaseNode(),regName.str()+"TCLKB_DR_EN",(uint32_t)enable); - }; - - /** - * get the TClkB output to the backplane status - * @returns the clock output status 0 -> disabled, 1 -> enabled - */ - uint8_t TClkBOutput() { - std::stringstream regName; - regName << "SYSTEM.CLK_CTRL."; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()+"TCLKB_DR_EN"); - }; - - /** - * control the xpoint switch - * @param xpoint2 0 -> xpoint1, 1 -> xpoint2 - * @param input selects the XPoint switch clock input to route - * @param output selects the XPoint switch clock output to route - * \brief Fucntion to control the routing of the two XPoint switches - * - * XPoint1 inputs 1-4 can be routed to outputs 1-4 - * XPoint1 input 1 carries XPoint2 output 1 - * XPoint1 input 2 carries SMA_CLK or the onboard 40MHz oscillator - * XPoint1 input 3 carries TCLKA - * XPoint1 input 4 carries FCLKA - * - * XPoint1 output 1 routes to IO_L0_GC_34 - * XPoint1 output 2 routes to TP - * XPoint1 output 3 routes to IO_L1_GC_34 - * XPoint1 output 4 routes to CDCE PRI_CLK - * - * XPoint2 can only have output 1 controlled (routing options are inputs 1-3 to output 1 - * - * XPoint2 inputs 1-4 can be routed to outputs 1-4 - * XPoint2 input 1 carries FMC1_CLK0_M2C - * XPoint2 input 2 carries FMC2_CLK0_M2C - * XPoint2 input 3 carries TCLKC - * XPoint2 input 4 carries nothing - * - * XPoint2 output 1 routes to XPoint1 input 1 - * XPoint2 output 2 routes to IO_L18_GC_35 - * XPoint2 output 3 routes to MGT113REFCLK1 - * XPoint2 output 4 routes nowhere - */ - void XPointControl(bool xpoint2, uint8_t const& input, uint8_t const& output); - - /** - * get the routing of the XPoint switch - * @returns the input that is currently routed to a specified output - */ - uint8_t XPointControl(bool xpoint2, uint8_t const& output); - - /** - * get the status of the GLIB SFP - * @param sfpcage - * @returns the 3 status bits of the specified SFP - */ - uint8_t SFPStatus(uint8_t const& sfpcage); - - /** - * get the presence of the FMC in slot 1 or 2 - * @param fmc2 true for FMC2 false for FMC1 - * @returns true if an FMC is in the selected slot - */ - bool FMCPresence(bool fmc2); - - /** - * is there a GbE interrupt on the PHY - * @returns true if there is an interrupt - */ - bool GbEInterrupt(); - - /** - * returns the state of the FPGA reset line (driven by the CPLD) - * @returns true if there is a reset - */ - bool FPGAResetStatus(); - - /** - * returns the status of the 6-bit bus between the FPGA and the CPLD - * @returns - */ - uint8_t V6CPLDStatus(); - - /** - * is the CDCE locked - * @returns true if the CDCE is locked - */ - bool CDCELockStatus(); - - /** Legacy GLIB firmware functionality **/ - /** - * Read the tracking data FIFO occupancy in terms of raw 32bit words - * @param uint8_t gtx is the number of the gtx to query - * @retval uint32_t returns the number of words in the tracking data FIFO - */ - uint32_t getFIFOOccupancy(uint8_t const& gtx); - - /** - * Read the tracking data FIFO occupancy in terms of the number of 7x32bit words - * composing a single VFAT block - * @param uint8_t gtx is the number of the gtx to query - * @retval uint32_t returns the number of VFAT blocks in the tracking data FIFO - */ - uint32_t getFIFOVFATBlockOccupancy(uint8_t const& gtx); - - /** - * see if there is tracking data available - * @param uint8_t gtx is the number of the column of the tracking data to read - * @retval bool returns true if there is tracking data in the FIFO - TRK_DATA.COLX.DATA_RDY - */ - bool hasTrackingData(uint8_t const& gtx); - - /** - * get the tracking data, have to do this intelligently, as IPBus transactions are expensive - * and need to pack all events together - * @param uint8_t gtx is the number of the GTX tracking data to read - * @param size_t nBlocks is the number of VFAT data blocks (7*32bit words) to read - * @retval std::vector returns the 7*nBlocks data words in the buffer - */ - std::vector getTrackingData(uint8_t const& gtx, size_t const& nBlocks=1); - //which of these will be better and do what we want - uint32_t getTrackingData(uint8_t const& gtx, uint32_t* data, size_t const& nBlocks=1); - //which of these will be better and do what we want - /* uint32_t getTrackingData(uint8_t const& gtx, std::vector& data, */ - /* size_t const& nBlocks=1); */ - - /** - * Empty the tracking data FIFO - * @param uint8_t gtx is the number of the gtx to query - * - */ - void flushFIFO(uint8_t const& gtx); - - protected: - //GLIBMonitor *monGLIB_; - - private: - - }; // class HwGLIB - } // namespace gem::hw::glib - } // namespace gem::hw -} // namespace gem - -#endif // GEM_HW_GLIB_HWGLIB_H diff --git a/gemhardware/devices/include/gem/hw/devices/optohybrid/HwOptoHybrid.h b/gemhardware/devices/include/gem/hw/devices/optohybrid/HwOptoHybrid.h index be58bbb8..157eba8b 100644 --- a/gemhardware/devices/include/gem/hw/devices/optohybrid/HwOptoHybrid.h +++ b/gemhardware/devices/include/gem/hw/devices/optohybrid/HwOptoHybrid.h @@ -10,26 +10,16 @@ namespace gem { namespace hw { - - class HwGenericAMC; + namespace amc { + class HwGenericAMC; + } namespace optohybrid { - // class OptoHybridMonitor; class HwOptoHybrid: public gem::hw::GEMHwDevice { public: - HwOptoHybrid(std::string const& optohybridDevice, std::string const& connectionFile); - HwOptoHybrid(std::string const& optohybridDevice, std::string const& connectionURI, std::string const& addressTable); - HwOptoHybrid(std::string const& optohybridDevice, uhal::HwInterface& uhalDevice); - HwOptoHybrid(gem::hw::HwGenericAMC const& amc, uint8_t const& slot); - - /* - // constructors from existing GEM hardware devices - HwOptoHybrid(uhal::HwInterface& device, uint8_t const& slot, uint8_t const& olink, uint8_t const& ); - HwOptoHybrid(GEMHwDevice const& device, uint8_t const& slot, uint8_t const& olink); - HwOptoHybrid(HwGLIB const& glib, uint8_t const& olink); - */ + HwOptoHybrid(std::string const& optohybridDevice); virtual ~HwOptoHybrid(); @@ -285,86 +275,6 @@ namespace gem { /** @} */ // end of adcinterface - - /** - * @defgroup scanmodule Scan Modules - * Functions related to the OptoHybrid firmware scan modules - * @{ - */ - /** - * @brief This function controls the firmware module that runs any of the scans - * @param uint8_t mode can be any of - * - 0 Threshold scan per VFAT with trigger data - * - 1 Threshold scan per channel using tracking data - * - 2 Latency scan per VFAT - * - 3 S-curve scan per channel - * - 4 Threshold scan per VFAT with tracking data - * @param uint8_t min is the minimum value to start the scan at (depending on the mode selected) - * - 0 VT1 - * - 1 VT1 - * - 2 Latency - * - 3 VCal - * - 4 VT1 - * @param uint8_t max is the maximum value to start the scan at (depending on the mode selected) - * - 0 VT1 - * - 1 VT1 - * - 2 Latency - * - 3 VCal - * - 4 VT1 - * @param uint8_t step is the size of the step between successive points - * @param uint32_t chip is the VFAT to run the scan on (if useUltra is true, this will be the VFAT mask) - * @param uint8_t channel is the channel to run the scan on (for modes 1 and 3 only) - * @param uint8_t min is the minimum value of the parameter to scan from - * @param uint8_t max is the maximum value of the paramter to scan to (must be greater than min) - * @param uint8_t step is the step size between successive scan points - * @param uint32_t nevts number of events to process before moving to the next scan point - * @param bool useUltra says whether to use the 24 VFATs in parallel mode (default is true) - * @param bool reset says whether to reset the module or not (default is false) - */ - void configureScanModule(uint8_t const& mode, uint32_t const& chip, uint8_t const& channel, - uint8_t const& min, uint8_t const& max, - uint8_t const& step, uint32_t const& nevts, - bool useUltra=true, bool reset=false); - - /** - * @brief Start the Scan controller (must be configured first or have a configuration already loaded) - * @param uint32_t evts number of events to process before moving to the next scan point - * @param bool useUltra says whether to use the 24 VFATs in parallel mode (default is true) - */ - void startScanModule(uint32_t const& nevts, bool useUltra=true); - - /** - * FIXME OBSOLETE V3 simply forwards call to getUltraScanResults - * @brief Get the results of the Scan controller - * @returns std::vector the data from the scan - * OBSOLETE V2 format - * data format is 0xYYZZZZZZ where - * YY is the scan parameter value - * ZZZZZZ is the number of events seen at that point - */ - std::vector getScanResults(uint32_t const& nevts, - uint32_t const& min, - uint32_t const& max, - uint32_t const& step); - - /** - * FIXME OBSOLETE V3 - * @brief Get the results of the ULTRA Scan controller - * @returns std::vector > the data from the scan - * OBSOLETE V2 format - * one set of results for each VFAT - * data format is 0xYYZZZZZZ where - * YY is the scan parameter value - * ZZZZZZ is the number of events seen at that point - */ - std::vector > getUltraScanResults(uint32_t const& nevts, - uint32_t const& min, - uint32_t const& max, - uint32_t const& step); - - /** @} */ // end of scanmodule - - /** * @defgroup ohlocalttc Optohybrid local TTC Command Generator * Functions related to the OptoHybrid TTC controller module @@ -551,8 +461,7 @@ namespace gem { * @param gbtcfg is an array of 92 32-bit words */ - void configureGBT(uint8_t const& gbtID, uint32_t const* gbtcfg); // FIXME, make private - void configureGBT(uint8_t const& gbtID, std::array const& gbtcfg); + void configureGBT(uint8_t const& gbtID, const gbt::config_t& gbtcfg); /** * @brief Sends a write request for all configuration registers on all GBTx chips diff --git a/gemhardware/devices/src/common/GEMHwDevice.cc b/gemhardware/devices/src/common/GEMHwDevice.cc index 0e7bbded..ea9a9164 100644 --- a/gemhardware/devices/src/common/GEMHwDevice.cc +++ b/gemhardware/devices/src/common/GEMHwDevice.cc @@ -1,54 +1,21 @@ /** * General structure taken blatantly from tcds::utils::HwDeviceTCA as we're using the same card * 11.2018: structure modified to inherit from both uhal::HwInterface and xhal::client::XHALInterface + * 23.2020: structure modified to drop uhal::HwInterface dependency and depends only on xhal::client::XHALInterface */ #include "gem/hw/devices/GEMHwDevice.h" #include -gem::hw::GEMHwDevice::GEMHwDevice(std::string const& deviceName, - std::string const& connectionFile) : +gem::hw::GEMHwDevice::GEMHwDevice(std::string const& deviceName) : xhal::client::XHALInterface(deviceName.substr(0,deviceName.rfind("-optohybrid"))), - uhal::HwInterface(std::shared_ptr(new uhal::ConnectionManager("file://${GEM_ADDRESS_TABLE_PATH}/"+connectionFile))->getDevice(deviceName)), - // b_is_connected(false), m_gemLogger(log4cplus::Logger::getInstance(deviceName)), m_hwLock(toolbox::BSem::FULL, true), m_crate(-1), m_slot(-1) { - CMSGEMOS_DEBUG("GEMHwDevice(std::string, std::string) ctor"); - - CMSGEMOS_DEBUG("GEMHwDevice::ctor done"); -} - -gem::hw::GEMHwDevice::GEMHwDevice(std::string const& deviceName, - std::string const& connectionURI, - std::string const& addressTable) : - xhal::client::XHALInterface(deviceName.substr(0,deviceName.rfind("-optohybrid"))), - uhal::HwInterface(uhal::ConnectionManager::getDevice(deviceName, connectionURI, addressTable)), - // b_is_connected(false), - m_gemLogger(log4cplus::Logger::getInstance(deviceName)), - m_hwLock(toolbox::BSem::FULL, true), - m_crate(-1), - m_slot(-1) -{ - CMSGEMOS_DEBUG("GEMHwDevice(std::string, std::string, std::string) ctor"); - - CMSGEMOS_DEBUG("GEMHwDevice::ctor done"); -} - -gem::hw::GEMHwDevice::GEMHwDevice(std::string const& deviceName, - uhal::HwInterface const& uhalDevice) : - xhal::client::XHALInterface(deviceName.substr(0,deviceName.rfind("-optohybrid"))), - uhal::HwInterface(uhalDevice), - // b_is_connected(false), - m_gemLogger(log4cplus::Logger::getInstance(deviceName)), - m_hwLock(toolbox::BSem::FULL, true), - m_crate(-1), - m_slot(-1) -{ - CMSGEMOS_DEBUG("GEMHwDevice(std::string, uhal::HwInterface) ctor"); + CMSGEMOS_DEBUG("GEMHwDevice(std::string) ctor"); CMSGEMOS_DEBUG("GEMHwDevice::ctor done"); } @@ -57,785 +24,58 @@ gem::hw::GEMHwDevice::~GEMHwDevice() { } -std::string gem::hw::GEMHwDevice::printErrorCounts() const +void gem::hw::GEMHwDevice::connectRPC(bool reconnect) { - std::stringstream errstream; - errstream << "errors while accessing registers:" << std::endl - << "Bad header: " << m_ipBusErrs.BadHeader << std::endl - << "Read errors: " << m_ipBusErrs.ReadError << std::endl - << "Timeouts: " << m_ipBusErrs.Timeout << std::endl - << "Controlhub errors: " << m_ipBusErrs.ControlHubErr << std::endl; - CMSGEMOS_TRACE(errstream.str()); - return errstream.str(); + if (isConnected) { + // TODO: find better way than hardcoded versions + this->loadModule("utils", "utils v1.0.1"); + CMSGEMOS_DEBUG("GEMHwDevice::connectRPC modules loaded"); + } else { + CMSGEMOS_WARN("GEMHwDevice::connectRPC RPC interface failed to connect"); + } } void gem::hw::GEMHwDevice::setup(std::string const& deviceName) { b_is_connected = false; - // if the root logger doesn't exist, need to create it, othewise, just get the instance - // set up the logging (do we have a parent logger or not?) - // log4cplus::SharedAppenderPtr appender(new log4cplus::NullAppender()); - // default to console? - // log to console? file? xml? port? - // log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender(true, true)); - // appender->setName(deviceName); - // log4cplus::Logger::getRoot().addAppender(appender); - - // m_gemLogger = log4cplus::Logger::getInstance(deviceName); - - setDeviceBaseNode(""); setDeviceID(deviceName); m_crate = extractDeviceID(deviceName,1); m_slot = extractDeviceID(deviceName,2); - m_ipBusErrs.BadHeader = 0; - m_ipBusErrs.ReadError = 0; - m_ipBusErrs.Timeout = 0; - m_ipBusErrs.ControlHubErr = 0; - - // uhal setup - setLogLevelTo(uhal::Error()); - // xhal setup connectRPC(); setLogLevel(1/*FIXME add enums to xhal, e.g., xhal::WARN*/); } -/////////////////////////////////////////////////////////////////////////////////////// -//****************Methods implemented for convenience on uhal devices****************// -/////////////////////////////////////////////////////////////////////////////////////// - uint32_t gem::hw::GEMHwDevice::readReg(std::string const& name) { gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - uint32_t res = 0x0; - CMSGEMOS_DEBUG("GEMHwDevice::readReg " << name << std::endl - << "Path " << this->getNode(name).getPath() << std::endl - << "Address 0x" << std::hex << this->getNode(name).getAddress() << std::dec << std::endl - << "Mask 0x" << std::hex << this->getNode(name).getMask() << std::dec << std::endl - << "Permission " << this->getNode(name).getPermission() << std::endl - << "Mode " << this->getNode(name).getMode() << std::endl - << "Size " << this->getNode(name).getSize() << std::endl - << std::endl); - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValWord val = this->getNode(name).read(); - this->dispatch(); - res = val.value(); - CMSGEMOS_TRACE("GEMHwDevice::Successfully read register " << name.c_str() << " with value 0x" - << std::setfill('0') << std::setw(8) << std::hex << res << std::dec - << " retry count is " << retryCount << ". Should move on to next operation"); - return res; - } catch (uhal::exception::exception const& err) { - std::stringstream errmsg, errcode; - errmsg << "Could not read register '" << name << "' (uHAL)"; - errcode << err.what(); - if (knownErrorCode(errcode.str())) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to read register " << name - << ". retryCount(" << retryCount << ")" - << std::endl); - updateErrorCounters(errcode.str()); - continue; - } else { - errmsg << ": " << errcode.str(); - CMSGEMOS_ERROR("GEMHwDevice::readReg " << errmsg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, errmsg.str()); - } - } catch (std::exception const& err) { - std::stringstream errmsg; - errmsg << "Could not read register '" << name << "' (std): " - << err.what(); - CMSGEMOS_ERROR("GEMHwDevice::" << errmsg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, errmsg.str()); - } - } - std::stringstream errmsg; - errmsg << "Maximum number of retries reached, unable to read register '" << name << "'"; - CMSGEMOS_ERROR("GEMHwDevice::" << errmsg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, errmsg.str()); - return res; -} - -uint32_t gem::hw::GEMHwDevice::readReg(uint32_t const& address) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - uint32_t res = 0x0; - CMSGEMOS_TRACE("GEMHwDevice::gem::hw::GEMHwDevice::readReg 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec << std::endl); - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValWord val = this->getClient().read(address); - this->dispatch(); - res = val.value(); - CMSGEMOS_TRACE("GEMHwDevice::Successfully read register 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec << " with value 0x" - << std::setfill('0') << std::setw(8) << std::hex << res << std::dec - << " retry count is " << retryCount << ". Should move on to next operation"); - return res; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not read register '0x%08x' (uHAL)", address); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to read register 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec - << ". retryCount("<(rpc, name); + } catch (std::exception const& err) { + //FIXME Review exception catching + CMSGEMOS_ERROR("GEMHwDevice::readReg error: " << err.what()); } - std::string msg = toolbox::toString("Maximum number of retries reached, unable to read register 0x%08x", - address); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); - return res; -} - -uint32_t gem::hw::GEMHwDevice::readReg(uint32_t const& address, uint32_t const& mask) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - unsigned retryCount = 0; - uint32_t res = 0x0; - CMSGEMOS_TRACE("GEMHwDevice::gem::hw::GEMHwDevice::readReg 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec << std::endl); - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValWord val = this->getClient().read(address,mask); - this->dispatch(); - res = val.value(); - CMSGEMOS_TRACE("GEMHwDevice::Successfully read register 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec << " with mask " - << std::hex << mask << std::dec << " with value " - << std::setfill('0') << std::setw(8) << std::hex << res << std::dec - << " retry count is " << retryCount << ". Should move on to next operation"); - return res; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not read register '0x%08x' (uHAL)", address); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to read register 0x" << std::setfill('0') << std::setw(8) - << std::hex << address << std::dec << " with mask " - << std::hex << address << std::dec - << ". retryCount("<getNode(name).getAddress(); - uint32_t mask = this->getNode(name).getMask(); - return readReg(address,mask); -} - -void gem::hw::GEMHwDevice::readRegs(register_pair_list ®List, int const& freq) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - std::vector > > vals; - // vals.reserve(regList.size()); - int counter{0}, dispatchcounter{0}; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) { - vals.push_back(std::make_pair(curReg->first,this->getNode(curReg->first).read())); - ++counter; - if (freq > 0 && counter%freq == 0) { - this->dispatch(); - ++dispatchcounter; - } - } - if (freq < 0 || counter%freq != 0) { - this->dispatch(); - ++dispatchcounter; - } - - CMSGEMOS_DEBUG("GEMHwDevice::readRegs dispatched " << dispatchcounter - << " calls for " << counter << " registers"); - // would like to have these local to the loop, how to do...? - auto curVal = vals.begin(); - auto curReg = regList.begin(); - for ( ; curReg != regList.end(); ++curVal,++curReg) - curReg->second = (curVal->second).value(); - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '%s'", curReg->first.c_str()); - std::string msg = toolbox::toString("%s (uHAL): %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - updateErrorCounters(errCode); - continue; - } else { - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, toolbox::toString("%s.", msgBase.c_str())); - } - } catch (std::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '%s'", curReg->first.c_str()); - std::string msg = toolbox::toString("%s (std): %s.", msgBase.c_str(), err.what()); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); - } - } - std::string msg = toolbox::toString("Maximum number of retries reached, unable to read registers"); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); -} - -void gem::hw::GEMHwDevice::readRegs(addressed_register_pair_list ®List, int const& freq) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - std::vector > > vals; - // vals.reserve(regList.size()); - int counter{0}, dispatchcounter{0}; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) { - vals.push_back(std::make_pair(curReg->first,this->getClient().read(curReg->first))); - ++counter; - if (freq > 0 && counter%freq == 0) { - this->dispatch(); - ++dispatchcounter; - } - } - if (freq < 0 || counter%freq != 0) { - this->dispatch(); - ++dispatchcounter; - } - - CMSGEMOS_DEBUG("GEMHwDevice::readRegs dispatched " << dispatchcounter - << " calls for " << counter << " registers"); - // would like to have these local to the loop, how to do...? - auto curVal = vals.begin(); - auto curReg = regList.begin(); - for ( ; curReg != regList.end(); ++curVal,++curReg) - curReg->second = (curVal->second).value(); - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '0x%08x mask 0x%08x'", curReg->first); - std::string msg = toolbox::toString("%s (uHAL): %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - updateErrorCounters(errCode); - continue; - } else { - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, toolbox::toString("%s.", msgBase.c_str())); - } - } catch (std::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '0x%08x mask 0x%08x'", curReg->first); - std::string msg = toolbox::toString("%s (std): %s.", msgBase.c_str(), err.what()); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); - } - } - std::string msg = toolbox::toString("Maximum number of retries reached, unable to read registers"); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); -} - -void gem::hw::GEMHwDevice::readRegs(masked_register_pair_list ®List, int const& freq) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - std::vector,uhal::ValWord > > vals; - // vals.reserve(regList.size()); - int counter{0}, dispatchcounter{0}; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) { - vals.push_back(std::make_pair(std::make_pair(curReg->first.first,curReg->first.second), - this->getClient().read(curReg->first.first,curReg->second))); - ++counter; - if (freq > 0 && counter%freq == 0) { - this->dispatch(); - ++dispatchcounter; - } - } - if (freq < 0 || counter%freq != 0) { - this->dispatch(); - ++dispatchcounter; - } - - CMSGEMOS_DEBUG("GEMHwDevice::readRegs dispatched " << dispatchcounter - << " calls for " << counter << " registers"); - // would like to have these local to the loop, how to do...? - auto curVal = vals.begin(); - auto curReg = regList.begin(); - for ( ; curReg != regList.end(); ++curVal,++curReg) - curReg->second = (curVal->second).value(); - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '0x%08x mask 0x%08x'", curReg->first.first, curReg->first.second); - std::string msg = toolbox::toString("%s (uHAL): %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - updateErrorCounters(errCode); - continue; - } else { - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, toolbox::toString("%s.", msgBase.c_str())); - } - } catch (std::exception const& err) { - std::string msgBase = "Could not read from register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '0x%08x mask 0x%08x'", curReg->first.first, curReg->first.second); - std::string msg = toolbox::toString("%s (std): %s.", msgBase.c_str(), err.what()); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); - } - } - std::string msg = toolbox::toString("Maximum number of retries reached, unable to read registers"); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); -} - void gem::hw::GEMHwDevice::writeReg(std::string const& name, uint32_t const val) { gem::utils::LockGuard guardedLock(m_hwLock); - - unsigned retryCount = 0; - CMSGEMOS_DEBUG("GEMHwDevice::writeReg " << name << std::endl - << "Path " << this->getNode(name).getPath() << std::endl - << "Address 0x" << std::hex << this->getNode(name).getAddress() << std::dec << std::endl - << "Mask 0x" << std::hex << this->getNode(name).getMask() << std::dec << std::endl - << "Permission " << this->getNode(name).getPermission() << std::endl - << "Mode " << this->getNode(name).getMode() << std::endl - << "Size " << this->getNode(name).getSize() << std::endl - << std::endl); - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValWord ival; - if (this->getNode(name).getPermission() != uhal::defs::WRITE) - ival = this->getNode(name).read(); - this->getNode(name).write(val); - uhal::ValWord rval; - if (this->getNode(name).getPermission() != uhal::defs::WRITE) - rval = this->getNode(name).read(); - this->dispatch(); - if (this->getNode(name).getPermission() != uhal::defs::WRITE) - CMSGEMOS_DEBUG("GEMHwDevice::writeReg initial: " - << std::hex << ival.value() << std::dec - << ", write val: " << std::hex << val << std::dec - << ", readback: " << std::hex << rval.value() << std::dec - << std::endl); - if (this->getNode(name).getPermission() != uhal::defs::WRITE) - if (rval.value() != val) { - std::string msgBase = toolbox::toString("WriteValueMismatch write (0x%x) to register '%s' resulted in 0x%x (uHAL)", - val, name.c_str(),rval.value()); - XCEPT_RAISE(gem::hw::devices::exception::WriteValueMismatch, toolbox::toString("%s.", msgBase.c_str())); - } - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not write to register '%s' (uHAL)", name.c_str()); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to write value 0x" << std::hex<< val << std::dec << " to register " << name - << ". retryCount("< guardedLock(m_hwLock); - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValWord ival = this->getClient().read(address); - this->getClient().write(address, val); - uhal::ValWord rval = this->getClient().read(address); - this->dispatch(); - CMSGEMOS_DEBUG("GEMHwDevice::writeReg initial: " - << std::hex << ival.value() << std::dec - << ", write val: " << std::hex << val << std::dec - << ", readback: " << std::hex << rval.value() << std::dec - << std::endl); - if (rval.value() != val) { - std::string msgBase = toolbox::toString("WriteValueMismatch write (0x%x) to register '0x%08x' resulted in 0x%x (uHAL)", - val,address,rval.value()); - XCEPT_RAISE(gem::hw::devices::exception::WriteValueMismatch, toolbox::toString("%s.", msgBase.c_str())); - } - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not write to register '0x%08x' (uHAL)", address); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to write value 0x" << std::hex<< val << std::dec << " to register 0x" - << std::setfill('0') << std::setw(8) << std::hex << address << std::dec - << ". retryCount("< guardedLock(m_hwLock); - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - int counter{0}, dispatchcounter{0}; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) { - this->getNode(curReg->first).write(curReg->second); - ++counter; - if (freq > 0 && counter%freq == 0) { - this->dispatch(); - ++dispatchcounter; - } - } - if (freq < 0 || counter%freq != 0) { - this->dispatch(); - ++dispatchcounter; - } - CMSGEMOS_DEBUG("GEMHwDevice::writeRegs dispatched " << dispatchcounter - << " calls for " << counter << " registers"); - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = "Could not write to register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '%s'", curReg->first.c_str()); - std::string msg = toolbox::toString("%s (uHAL): %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - updateErrorCounters(errCode); - continue; - } else { - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, toolbox::toString("%s.", msgBase.c_str())); - } - } catch (std::exception const& err) { - std::string msgBase = "Could not write to register in list:"; - for (auto curReg = regList.begin(); curReg != regList.end(); ++curReg) - msgBase += toolbox::toString(" '%s'", curReg->first.c_str()); - std::string msg = toolbox::toString("%s (std): %s.", msgBase.c_str(), err.what()); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); - } - } -} - -void gem::hw::GEMHwDevice::writeValueToRegs(std::vector const& regNames, uint32_t const& regValue, int const& freq) -{ - register_pair_list regsToWrite; - for (auto curReg = regNames.begin(); curReg != regNames.end(); ++curReg) - regsToWrite.push_back(std::make_pair(*curReg,regValue)); - writeRegs(regsToWrite,freq); -} - -/* - void gem::hw::GEMHwDevice::zeroReg(std::string const& name) - { - writeReg(name,0); - } -*/ - -void gem::hw::GEMHwDevice::zeroRegs(std::vector const& regNames, int const& freq) -{ - register_pair_list regsToZero; - for (auto curReg = regNames.begin(); curReg != regNames.end(); ++curReg) - regsToZero.push_back(std::make_pair(*curReg,0x0)); - writeRegs(regsToZero,freq); -} - -std::vector gem::hw::GEMHwDevice::readBlock(std::string const& name) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - size_t numWords = this->getNode(name).getSize(); - CMSGEMOS_TRACE("GEMHwDevice::reading block " << name << " which has size "< gem::hw::GEMHwDevice::readBlock(std::string const& name, size_t const& numWords) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - std::vector res(numWords); - - unsigned retryCount = 0; - if (numWords < 1) - return res; - - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - uhal::ValVector values = this->getNode(name).readBlock(numWords); - this->dispatch(); - std::copy(values.begin(), values.end(), res.begin()); - return res; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not read block '%s' (uHAL)", name.c_str()); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to read block " << name << " with " << numWords << " words" - << ". retryCount("<& buffer, -// size_t const& numWords) -// { -// // not yet implemented -// return 0; -// } - -void gem::hw::GEMHwDevice::writeBlock(std::string const& name, std::vector const values) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - if (values.size() < 1) - return; - - unsigned retryCount = 0; - while (retryCount < MAX_IPBUS_RETRIES) { - ++retryCount; - try { - this->getNode(name).writeBlock(values); - this->dispatch(); - return; - } catch (uhal::exception::exception const& err) { - std::string msgBase = toolbox::toString("Could not write to block '%s' (uHAL)", name.c_str()); - std::string msg = toolbox::toString("%s: %s.", msgBase.c_str(), err.what()); - std::string errCode = toolbox::toString("%s",err.what()); - if (knownErrorCode(errCode)) { - ++retryCount; - if (retryCount > (MAX_IPBUS_RETRIES-1)) - CMSGEMOS_DEBUG("GEMHwDevice::Failed to write block " << name - << ". retryCount("<(rpc, name, val); + } catch (std::exception const& err) { + //FIXME Review exception catching + CMSGEMOS_ERROR("GEMHwDevice::writeReg error: " << err.what()); } - std::string msg = toolbox::toString("Maximum number of retries reached, unable to write block %s",name.c_str()); - CMSGEMOS_ERROR("GEMHwDevice::" << msg); - // XCEPT_RAISE(gem::hw::devices::exception::HardwareProblem, msg); -} - -std::vector gem::hw::GEMHwDevice::readFIFO(std::string const& name) -{ - return readBlock(name); -} - -std::vector gem::hw::GEMHwDevice::readFIFO(std::string const& name, size_t const& numWords) -{ - std::vector result; - for (size_t word = 0; word < numWords; ++word) - result.push_back(readReg(name)); - - return result; -} - -void gem::hw::GEMHwDevice::writeFIFO(std::string const& name, std::vector const values) -{ - for (auto word = values.begin(); word != values.end(); ++word) - writeReg(name,*word); - return; -} - -void gem::hw::GEMHwDevice::zeroFIFO(std::string const& name) -{ - return writeReg(name+".FLUSH",0x0); -} - -bool gem::hw::GEMHwDevice::knownErrorCode(std::string const& errCode) const -{ - return ((errCode.find("amount of data") != std::string::npos) || - (errCode.find("INFO CODE = 0x4L") != std::string::npos) || - (errCode.find("INFO CODE = 0x6L") != std::string::npos) || - (errCode.find("timed out") != std::string::npos) || - (errCode.find("had response field = 0x04") != std::string::npos) || - (errCode.find("had response field = 0x06") != std::string::npos) || - (errCode.find("ControlHub error code is: 3") != std::string::npos) || - (errCode.find("ControlHub error code is: 4") != std::string::npos)); -} - - -void gem::hw::GEMHwDevice::updateErrorCounters(std::string const& errCode) const -{ - if (errCode.find("amount of data") != std::string::npos) - ++m_ipBusErrs.BadHeader; - if (errCode.find("INFO CODE = 0x4L") != std::string::npos) - ++m_ipBusErrs.ReadError; - if ((errCode.find("INFO CODE = 0x6L") != std::string::npos) || - (errCode.find("timed out") != std::string::npos)) - ++m_ipBusErrs.Timeout; - if (errCode.find("ControlHub error code") != std::string::npos) - ++m_ipBusErrs.ControlHubErr; - if ((errCode.find("had response field = 0x04") != std::string::npos) || - (errCode.find("had response field = 0x06") != std::string::npos)) - ++m_ipBusErrs.ControlHubErr; -} - -void gem::hw::GEMHwDevice::zeroBlock(std::string const& name) -{ - gem::utils::LockGuard guardedLock(m_hwLock); - - size_t numWords = this->getNode(name).getSize(); - std::vector zeros(numWords, 0); - return writeBlock(name, zeros); -} - -void gem::hw::GEMHwDevice::checkRPCResponse(std::string const& caller) const -{ - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - CMSGEMOS_ERROR(caller << ": " << errmsg.str()); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } else if (rsp.get_key_exists("rpcerror")) { - std::stringstream errmsg; - errmsg << rsp.get_string("rpcerror"); - CMSGEMOS_ERROR(caller << ": " << errmsg.str()); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } + CMSGEMOS_TRACE("GEMHwDevice::Successfully wrote register " << name.c_str() << " with value 0x" + << std::setfill('0') << std::setw(8) << std::hex << val); } uint8_t gem::hw::GEMHwDevice::extractDeviceID(std::string const& deviceName, uint8_t const& index) diff --git a/gemhardware/devices/src/common/amc/HwGenericAMC.cc b/gemhardware/devices/src/common/amc/HwGenericAMC.cc index eeab3689..fe25f2c9 100644 --- a/gemhardware/devices/src/common/amc/HwGenericAMC.cc +++ b/gemhardware/devices/src/common/amc/HwGenericAMC.cc @@ -1,78 +1,29 @@ #include "gem/hw/devices/amc/HwGenericAMC.h" +#include "ctp7_modules/common/amc.h" +#include "ctp7_modules/common/amc/daq.h" +#include "ctp7_modules/common/amc/ttc.h" #include -gem::hw::HwGenericAMC::HwGenericAMC(std::string const& amcDevice, - std::string const& connectionFile) : - gem::hw::GEMHwDevice::GEMHwDevice(amcDevice, connectionFile), +gem::hw::amc::HwGenericAMC::HwGenericAMC(std::string const& amcDevice) : + gem::hw::GEMHwDevice::GEMHwDevice(amcDevice), m_links(0), m_maxLinks(gem::hw::utils::N_GTX) { CMSGEMOS_INFO("HwGenericAMC ctor"); this->setup(amcDevice); - this->setDeviceBaseNode("GEM_AMC"); - - for (unsigned li = 0; li < gem::hw::utils::N_GTX; ++li) { - AMCIPBusCounters tmpGTXCounter; - m_ipBusCounters.push_back(tmpGTXCounter); - } - - CMSGEMOS_INFO("HwGenericAMC ctor done, deviceBaseNode is " << getDeviceBaseNode()); + CMSGEMOS_INFO("HwGenericAMC ctor done"); } -gem::hw::HwGenericAMC::HwGenericAMC(std::string const& amcDevice, - std::string const& connectionURI, - std::string const& addressTable) : - gem::hw::GEMHwDevice::GEMHwDevice(amcDevice, connectionURI, addressTable), - m_links(0), - m_maxLinks(gem::hw::utils::N_GTX) +gem::hw::amc::HwGenericAMC::~HwGenericAMC() { - CMSGEMOS_INFO("trying to create HwGenericAMC(" << amcDevice << "," << connectionURI << "," <setup(amcDevice); - this->setDeviceBaseNode("GEM_AMC"); - for (unsigned li = 0; li < gem::hw::utils::N_GTX; ++li) { - AMCIPBusCounters tmpGTXCounter; - m_ipBusCounters.push_back(tmpGTXCounter); - } - - CMSGEMOS_INFO("HwGenericAMC ctor done, deviceBaseNode is " << getDeviceBaseNode()); } -gem::hw::HwGenericAMC::HwGenericAMC(std::string const& amcDevice, - uhal::HwInterface& uhalDevice) : - gem::hw::GEMHwDevice::GEMHwDevice(amcDevice,uhalDevice), - m_links(0), - m_maxLinks(gem::hw::utils::N_GTX) -{ - this->setup(amcDevice); - this->setDeviceBaseNode("GEM_AMC"); // needed? - - for (unsigned li = 0; li < gem::hw::utils::N_GTX; ++li) { - AMCIPBusCounters tmpGTXCounter; - m_ipBusCounters.push_back(tmpGTXCounter); - } - - CMSGEMOS_INFO("HwGenericAMC::HwGenericAMC ctor done, deviceBaseNode is " << getDeviceBaseNode()); -} - -// gem::hw::HwGenericAMC::HwGenericAMC(int const& shelf, -// int const& slot, -// bool uhalNative) : -// gem::hw::HwGenericAMC::HwGenericAMC(toolbox::toString("gem-shelf%02d-amc%02d",shelf,slot), -// connectionURI, -// addressTable -// ) -// { -// } - -gem::hw::HwGenericAMC::~HwGenericAMC() -{ -} - -void gem::hw::HwGenericAMC::connectRPC(bool reconnect) +void gem::hw::amc::HwGenericAMC::connectRPC(bool reconnect) { if (isConnected) { // TODO: find better way than hardcoded versions + this->gem::hw::GEMHwDevice::connectRPC(); //FIXME required as atomic transactions are still used here this->loadModule("amc", "amc v1.0.1"); CMSGEMOS_DEBUG("HwGenericAMC::connectRPC modules loaded"); } else { @@ -80,7 +31,7 @@ void gem::hw::HwGenericAMC::connectRPC(bool reconnect) } } -bool gem::hw::HwGenericAMC::isHwConnected() +bool gem::hw::amc::HwGenericAMC::isHwConnected() { // DO NOT LIKE THIS FUNCTION FIXME!!! if (b_is_connected) { @@ -122,89 +73,66 @@ bool gem::hw::HwGenericAMC::isHwConnected() } } -std::string gem::hw::HwGenericAMC::getBoardIDString(bool const legacy) +std::string gem::hw::amc::HwGenericAMC::getBoardIDString() { // gem::utils::LockGuard guardedLock(hwLock_); // The board ID consists of four characters encoded as a 32-bit unsigned int std::string res = "N/A"; - uint32_t brdID = getBoardID(legacy); - - if (legacy) - res = gem::utils::uint32ToString(brdID); - else - res = toolbox::toString("%x",brdID); + uint32_t brdID = getBoardID(); + res = toolbox::toString("%x",brdID); return res; } -uint32_t gem::hw::HwGenericAMC::getBoardID(bool const legacy) +uint32_t gem::hw::amc::HwGenericAMC::getBoardID() { - // gem::utils::LockGuard guardedLock(hwLock_); - // The board ID consists of four characters encoded as a 32-bit unsigned int - if (legacy) - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.LEGACY_SYSTEM.BOARD_ID"); - else - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.BOARD_ID"); + return readReg("GEM_AMC.GEM_SYSTEM.BOARD_ID"); } -std::string gem::hw::HwGenericAMC::getBoardTypeString(bool const legacy) +std::string gem::hw::amc::HwGenericAMC::getBoardTypeString() { // gem::utils::LockGuard guardedLock(hwLock_); // The board ID consists of four characters encoded as a 32-bit unsigned int std::string res = "N/A"; - uint32_t brdID = getBoardType(legacy); - - if (legacy) - res = gem::utils::uint32ToString(brdID); - else - res = toolbox::toString("%x",brdID); + uint32_t brdID = getBoardType(); + res = toolbox::toString("%x",brdID); return res; } -uint32_t gem::hw::HwGenericAMC::getBoardType(bool const legacy) +uint32_t gem::hw::amc::HwGenericAMC::getBoardType() { // gem::utils::LockGuard guardedLock(hwLock_); // The board type consists of four characters encoded as a 32-bit unsigned int - if (legacy) - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.BOARD_TYPE"); - else - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.BOARD_TYPE"); + return readReg("GEM_AMC.GEM_SYSTEM.BOARD_TYPE"); } -std::string gem::hw::HwGenericAMC::getSystemIDString(bool const legacy) +std::string gem::hw::amc::HwGenericAMC::getSystemIDString() { // gem::utils::LockGuard guardedLock(hwLock_); // The system ID consists of four characters encoded as a 32-bit unsigned int std::string res = "N/A"; - uint32_t sysID = getSystemID(legacy); - - if (legacy) - res = gem::utils::uint32ToString(sysID); - else - res = toolbox::toString("%x",sysID); + uint32_t sysID = getSystemID(); + res = toolbox::toString("%x",sysID); return res; } -uint32_t gem::hw::HwGenericAMC::getSystemID(bool const legacy) +uint32_t gem::hw::amc::HwGenericAMC::getSystemID() { // gem::utils::LockGuard guardedLock(hwLock_); // The system ID consists of four characters encoded as a 32-bit unsigned int - if (legacy) - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.LEGACY_SYSTEM.SYSTEM_ID"); - else - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.BOARD_TYPE"); + return readReg("GEM_AMC.GEM_SYSTEM.BOARD_TYPE"); } -uint32_t gem::hw::HwGenericAMC::getSupportedOptoHybrids() +uint32_t gem::hw::amc::HwGenericAMC::getSupportedOptoHybrids() { - return readReg(getDeviceBaseNode(),"GEM_SYSTEM.CONFIG.NUM_OF_OH"); + return readReg("GEM_AMC.GEM_SYSTEM.CONFIG.NUM_OF_OH"); } -uint32_t gem::hw::HwGenericAMC::supportsTriggerLink() +uint32_t gem::hw::amc::HwGenericAMC::supportsTriggerLink() { - return readReg(getDeviceBaseNode(),"GEM_SYSTEM.CONFIG.USE_TRIG_LINKS"); + return readReg("GEM_AMC.GEM_SYSTEM.CONFIG.USE_TRIG_LINKS"); } -std::string gem::hw::HwGenericAMC::getFirmwareDateString(bool const& system) +std::string gem::hw::amc::HwGenericAMC::getFirmwareDateString(bool const& system) { // gem::utils::LockGuard guardedLock(hwLock_); std::stringstream res; @@ -219,16 +147,16 @@ std::string gem::hw::HwGenericAMC::getFirmwareDateString(bool const& system) return res.str(); } -uint32_t gem::hw::HwGenericAMC::getFirmwareDate(bool const& system) +uint32_t gem::hw::amc::HwGenericAMC::getFirmwareDate(bool const& system) { // gem::utils::LockGuard guardedLock(hwLock_); if (system) - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.RELEASE.DATE"); + return readReg("GEM_AMC.GEM_SYSTEM.RELEASE.DATE"); else - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.RELEASE.DATE"); + return readReg("GEM_AMC.GEM_SYSTEM.RELEASE.DATE"); } -std::string gem::hw::HwGenericAMC::getFirmwareVerString(bool const& system) +std::string gem::hw::amc::HwGenericAMC::getFirmwareVerString(bool const& system) { // gem::utils::LockGuard guardedLock(hwLock_); std::stringstream res; @@ -244,23 +172,23 @@ std::string gem::hw::HwGenericAMC::getFirmwareVerString(bool const& system) return res.str(); } -uint32_t gem::hw::HwGenericAMC::getFirmwareVer(bool const& system) +uint32_t gem::hw::amc::HwGenericAMC::getFirmwareVer(bool const& system) { // gem::utils::LockGuard guardedLock(hwLock_); if (system) - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.RELEASE"); + return readReg("GEM_AMC.GEM_SYSTEM.RELEASE"); else - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.RELEASE"); + return readReg("GEM_AMC.GEM_SYSTEM.RELEASE"); } /** User core functionality **/ -uint32_t gem::hw::HwGenericAMC::getUserFirmware() +uint32_t gem::hw::amc::HwGenericAMC::getUserFirmware() { // This returns the firmware register (V2 removed the user firmware specific). - return readReg(getDeviceBaseNode(), "GEM_SYSTEM.RELEASE"); + return readReg("GEM_AMC.GEM_SYSTEM.RELEASE"); } -std::string gem::hw::HwGenericAMC::getUserFirmwareDate() +std::string gem::hw::amc::HwGenericAMC::getUserFirmwareDate() { // This returns the user firmware build date. std::stringstream res; @@ -268,7 +196,7 @@ std::string gem::hw::HwGenericAMC::getUserFirmwareDate() return res.str(); } -bool gem::hw::HwGenericAMC::linkCheck(uint8_t const& gtx, std::string const& opMsg) +bool gem::hw::amc::HwGenericAMC::linkCheck(uint8_t const& gtx, std::string const& opMsg) { CMSGEMOS_INFO("linkCheck:: m_links 0x" << std::hex <(rpc, enableZS, runType, doPhaseShift, relock, bc0LockPSMode); + } GEM_CATCH_RPC_ERROR("HwGenericAMC::configureDAQModule", gem::hw::devices::exception::Exception); } -void gem::hw::HwGenericAMC::enableDAQLink(uint32_t const& enableMask) +void gem::hw::amc::HwGenericAMC::enableDAQLink(uint32_t const& enableMask) +//FIXME the meaning of the remote method has changed!!! { try { - req = wisc::RPCMsg("amc.enableDAQLink"); - req.set_word("enableMask",enableMask); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - CMSGEMOS_ERROR("HwGenericAMC::enableDAQLink: " << errmsg.str()); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - } STANDARD_CATCH; + xhal::common::rpc::call<::amc::daq::enableDAQLink>(rpc, enableMask); } GEM_CATCH_RPC_ERROR("HwGenericAMC::enableDAQLink", gem::hw::devices::exception::Exception); } -void gem::hw::HwGenericAMC::disableDAQLink() +void gem::hw::amc::HwGenericAMC::disableDAQLink() { try { - req = wisc::RPCMsg("amc.disableDAQLink"); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - CMSGEMOS_ERROR("HwGenericAMC::disableDAQLink: " << errmsg.str()); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - } STANDARD_CATCH; - } GEM_CATCH_RPC_ERROR("HwGenericAMC::enableDAQLink", gem::hw::devices::exception::Exception); + xhal::common::rpc::call<::amc::daq::disableDAQLink>(rpc); + } GEM_CATCH_RPC_ERROR("HwGenericAMC::disableDAQLink", gem::hw::devices::exception::Exception); } -void gem::hw::HwGenericAMC::setZS(bool en) +void gem::hw::amc::HwGenericAMC::setZS(bool en) { - writeReg(getDeviceBaseNode(), "DAQ.CONTROL.ZERO_SUPPRESSION_EN", uint32_t(en)); + writeReg("GEM_AMC.DAQ.CONTROL.ZERO_SUPPRESSION_EN", uint32_t(en)); } -void gem::hw::HwGenericAMC::resetDAQLink(uint32_t const& davTO, uint32_t const& ttsOverride) +void gem::hw::amc::HwGenericAMC::resetDAQLink(uint32_t const& davTO, uint32_t const& ttsOverride) { try { - req = wisc::RPCMsg("amc.resetDAQLink"); - req.set_word("davTO", davTO); - req.set_word("ttsOverride", ttsOverride); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - } STANDARD_CATCH; - /* FIXME alternative - // should reraise gem::hw::devices::exception::RPCMethodError as a result of the STANDARD_CATCH - // turn this into a macro? - } catch (...) { - handleRPCError("HwGenericAMC::enableDAQLink"); - // https://stackoverflow.com/questions/3561659/how-can-i-abstract-out-a-repeating-try-catch-pattern-in-c - // https://stackoverflow.com/questions/2466131/is-re-throwing-an-exception-legal-in-a-nested-try - // https://stackoverflow.com/questions/13007793/is-a-macro-to-catch-a-set-of-exceptions-at-different-places-fine - // with lambdas - // https://codereview.stackexchange.com/questions/2484/generic-c-exception-catch-handler-macro - } - */ - } GEM_CATCH_RPC_ERROR("HwGenericAMC::enableDAQLink", gem::hw::devices::exception::Exception); + xhal::common::rpc::call<::amc::daq::resetDAQLink>(rpc, davTO, ttsOverride); + } GEM_CATCH_RPC_ERROR("HwGenericAMC::resetDAQLink", gem::hw::devices::exception::Exception); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkControl() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkControl() { - return readReg(getDeviceBaseNode(), "DAQ.CONTROL"); + return readReg("GEM_AMC.DAQ.CONTROL"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkStatus() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkStatus() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS"); + return readReg("GEM_AMC.DAQ.STATUS"); } -bool gem::hw::HwGenericAMC::daqLinkReady() +bool gem::hw::amc::HwGenericAMC::daqLinkReady() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.DAQ_LINK_RDY"); + return readReg("GEM_AMC.DAQ.STATUS.DAQ_LINK_RDY"); } -bool gem::hw::HwGenericAMC::daqClockLocked() +bool gem::hw::amc::HwGenericAMC::daqClockLocked() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.DAQ_CLK_LOCKED"); + return readReg("GEM_AMC.DAQ.STATUS.DAQ_CLK_LOCKED"); } -bool gem::hw::HwGenericAMC::daqTTCReady() +bool gem::hw::amc::HwGenericAMC::daqTTCReady() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.TTC_RDY"); + return readReg("GEM_AMC.DAQ.STATUS.TTC_RDY"); } -uint8_t gem::hw::HwGenericAMC::daqTTSState() +uint8_t gem::hw::amc::HwGenericAMC::daqTTSState() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.TTS_STATE"); + return readReg("GEM_AMC.DAQ.STATUS.TTS_STATE"); } -bool gem::hw::HwGenericAMC::daqAlmostFull() +bool gem::hw::amc::HwGenericAMC::daqAlmostFull() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.DAQ_AFULL"); + return readReg("GEM_AMC.DAQ.STATUS.DAQ_AFULL"); } -bool gem::hw::HwGenericAMC::l1aFIFOIsEmpty() +bool gem::hw::amc::HwGenericAMC::l1aFIFOIsEmpty() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.L1A_FIFO_IS_EMPTY"); + return readReg("GEM_AMC.DAQ.STATUS.L1A_FIFO_IS_EMPTY"); } -bool gem::hw::HwGenericAMC::l1aFIFOIsAlmostFull() +bool gem::hw::amc::HwGenericAMC::l1aFIFOIsAlmostFull() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.L1A_FIFO_IS_NEAR_FULL"); + return readReg("GEM_AMC.DAQ.STATUS.L1A_FIFO_IS_NEAR_FULL"); } -bool gem::hw::HwGenericAMC::l1aFIFOIsFull() +bool gem::hw::amc::HwGenericAMC::l1aFIFOIsFull() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.L1A_FIFO_IS_FULL"); + return readReg("GEM_AMC.DAQ.STATUS.L1A_FIFO_IS_FULL"); } -bool gem::hw::HwGenericAMC::l1aFIFOIsUnderflow() +bool gem::hw::amc::HwGenericAMC::l1aFIFOIsUnderflow() { - return readReg(getDeviceBaseNode(), "DAQ.STATUS.L1A_FIFO_IS_UNDERFLOW"); + return readReg("GEM_AMC.DAQ.STATUS.L1A_FIFO_IS_UNDERFLOW"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkEventsSent() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkEventsSent() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.EVT_SENT"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.EVT_SENT"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkL1AID() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkL1AID() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.L1AID"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.L1AID"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkDisperErrors() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkDisperErrors() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.DISPER_ERR"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.DISPER_ERR"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkNonidentifiableErrors() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkNonidentifiableErrors() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.NOTINTABLE_ERR"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.NOTINTABLE_ERR"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkInputMask() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkInputMask() { - return readReg(getDeviceBaseNode(), "DAQ.CONTROL.INPUT_ENABLE_MASK"); + return readReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkDAVTimeout() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkDAVTimeout() { - return readReg(getDeviceBaseNode(), "DAQ.CONTROL.DAV_TIMEOUT"); + return readReg("GEM_AMC.DAQ.CONTROL.DAV_TIMEOUT"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkDAVTimer(bool const& max) +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkDAVTimer(bool const& max) { if (max) - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.MAX_DAV_TIMER"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.MAX_DAV_TIMER"); else - return readReg(getDeviceBaseNode(), "DAQ.EXT_STATUS.LAST_DAV_TIMER"); + return readReg("GEM_AMC.DAQ.EXT_STATUS.LAST_DAV_TIMER"); } /** GTX specific DAQ link information **/ // TODO: should rename, "DAQ link" is a back end FW term, not corresponding to a front end link... -uint32_t gem::hw::HwGenericAMC::getLinkDAQStatus(uint8_t const& gtx) +uint32_t gem::hw::amc::HwGenericAMC::getLinkDAQStatus(uint8_t const& gtx) { // do link protections here... std::stringstream regBase; regBase << "DAQ.OH" << (int)gtx; - return readReg(getDeviceBaseNode(),regBase.str()+".STATUS"); + return readReg("GEM_AMC."+regBase.str()+".STATUS"); } -uint32_t gem::hw::HwGenericAMC::getLinkDAQCounters(uint8_t const& gtx, uint8_t const& mode) +uint32_t gem::hw::amc::HwGenericAMC::getLinkDAQCounters(uint8_t const& gtx, uint8_t const& mode) { std::stringstream regBase; regBase << "DAQ.OH" << (int)gtx << ".COUNTERS"; if (mode == 0) - return readReg(getDeviceBaseNode(),regBase.str()+".CORRUPT_VFAT_BLK_CNT"); + return readReg("GEM_AMC."+regBase.str()+".CORRUPT_VFAT_BLK_CNT"); else - return readReg(getDeviceBaseNode(),regBase.str()+".EVN"); + return readReg("GEM_AMC."+regBase.str()+".EVN"); } -uint32_t gem::hw::HwGenericAMC::getLinkLastDAQBlock(uint8_t const& gtx) +uint32_t gem::hw::amc::HwGenericAMC::getLinkLastDAQBlock(uint8_t const& gtx) { std::stringstream regBase; regBase << "DAQ.OH" << (int)gtx; - return readReg(getDeviceBaseNode(),regBase.str()+".LASTBLOCK"); + return readReg("GEM_AMC."+regBase.str()+".LASTBLOCK"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkInputTimeout() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkInputTimeout() { // OBSOLETE, NO LONGER PRESENT - return readReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.INPUT_TIMEOUT"); + return readReg("GEM_AMC.DAQ.EXT_CONTROL.INPUT_TIMEOUT"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkRunType() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkRunType() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.RUN_TYPE"); + return readReg("GEM_AMC.DAQ.EXT_CONTROL.RUN_TYPE"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkRunParameters() +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkRunParameters() { - return readReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.RUN_PARAMS"); + return readReg("GEM_AMC.DAQ.EXT_CONTROL.RUN_PARAMS"); } -uint32_t gem::hw::HwGenericAMC::getDAQLinkRunParameter(uint8_t const& parameter) +uint32_t gem::hw::amc::HwGenericAMC::getDAQLinkRunParameter(uint8_t const& parameter) { std::stringstream regBase; regBase << "DAQ.EXT_CONTROL.RUN_PARAM" << (int) parameter; - return readReg(getDeviceBaseNode(),regBase.str()); + return readReg("GEM_AMC."+regBase.str()); } -void gem::hw::HwGenericAMC::setDAQLinkInputTimeout(uint32_t const& value) +void gem::hw::amc::HwGenericAMC::setDAQLinkInputTimeout(uint32_t const& value) { // for (unsigned li = 0; li < m_maxLinks; ++li) { // for (unsigned li = m_maxLinks - 1; li > -1; --li) { - // writeReg(getDeviceBaseNode(), toolbox::toString("DAQ.OH%d.CONTROL.EOE_TIMEOUT", li), value); + // writeReg("GEM_AMC."+toolbox::toString("DAQ.OH%d.CONTROL.EOE_TIMEOUT", li), value); // } - // return writeReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.INPUT_TIMEOUT",value); + // return writeReg("GEM_AMC.DAQ.EXT_CONTROL.INPUT_TIMEOUT",value); } -void gem::hw::HwGenericAMC::setDAQLinkRunType(uint32_t const& value) +void gem::hw::amc::HwGenericAMC::setDAQLinkRunType(uint32_t const& value) { - return writeReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.RUN_TYPE",value); + return writeReg("GEM_AMC.DAQ.EXT_CONTROL.RUN_TYPE",value); } -void gem::hw::HwGenericAMC::setDAQLinkRunParameters(uint32_t const& value) +void gem::hw::amc::HwGenericAMC::setDAQLinkRunParameters(uint32_t const& value) { - return writeReg(getDeviceBaseNode(), "DAQ.EXT_CONTROL.RUN_PARAMS",value); + return writeReg("GEM_AMC.DAQ.EXT_CONTROL.RUN_PARAMS",value); } -void gem::hw::HwGenericAMC::setDAQLinkRunParameter(uint8_t const& parameter, uint8_t const& value) +void gem::hw::amc::HwGenericAMC::setDAQLinkRunParameter(uint8_t const& parameter, uint8_t const& value) { if (parameter < 1 || parameter > 3) { std::string msg = toolbox::toString("Attempting to set DAQ link run parameter %d: outside expectation (1-%d)", @@ -608,7 +473,7 @@ void gem::hw::HwGenericAMC::setDAQLinkRunParameter(uint8_t const& parameter, uin } std::stringstream regBase; regBase << "DAQ.EXT_CONTROL.RUN_PARAM" << (int) parameter; - writeReg(getDeviceBaseNode(),regBase.str(),value); + writeReg("GEM_AMC."+regBase.str(),value); } /********************************/ @@ -616,200 +481,147 @@ void gem::hw::HwGenericAMC::setDAQLinkRunParameter(uint8_t const& parameter, uin /********************************/ /** TTC module functions **/ -void gem::hw::HwGenericAMC::ttcModuleReset() +void gem::hw::amc::HwGenericAMC::ttcModuleReset() { - writeReg(getDeviceBaseNode(), "TTC.CTRL.MODULE_RESET", 0x1); + writeReg("GEM_AMC.TTC.CTRL.MODULE_RESET", 0x1); } -void gem::hw::HwGenericAMC::ttcMMCMReset() +void gem::hw::amc::HwGenericAMC::ttcMMCMReset() { - writeReg(getDeviceBaseNode(), "TTC.CTRL.MMCM_RESET", 0x1); - // writeReg(getDeviceBaseNode(), "TTC.CTRL.PHASE_ALIGNMENT_RESET", 0x1); + writeReg("GEM_AMC.TTC.CTRL.MMCM_RESET", 0x1); + // writeReg("GEM_AMC.TTC.CTRL.PHASE_ALIGNMENT_RESET", 0x1); } -void gem::hw::HwGenericAMC::ttcMMCMPhaseShift(bool relock, bool modeBC0, bool scan) +void gem::hw::amc::HwGenericAMC::ttcMMCMPhaseShift(bool relock, bool modeBC0, bool scan) { try { - req = wisc::RPCMsg("amc.ttcMMCMPhaseShift"); - req.set_word("relock", relock); - req.set_word("modeBC0", modeBC0); - req.set_word("scan", scan); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - } STANDARD_CATCH; + xhal::common::rpc::call<::amc::ttc::ttcMMCMPhaseShift>(rpc, relock, modeBC0, scan); } GEM_CATCH_RPC_ERROR("HwGenericAMC::ttcMMCMPhaseShift", gem::hw::devices::exception::Exception); } -int gem::hw::HwGenericAMC::checkPLLLock(uint32_t readAttempts) +int gem::hw::amc::HwGenericAMC::checkPLLLock(uint32_t readAttempts) { try { - req = wisc::RPCMsg("amc.checkPLLLock"); - req.set_word("readAttempts", readAttempts); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - return rsp.get_word("lockCnt"); - } STANDARD_CATCH; + xhal::common::rpc::call<::amc::ttc::checkPLLLock>(rpc, readAttempts); } GEM_CATCH_RPC_ERROR("HwGenericAMC::checkPLLLock", gem::hw::devices::exception::Exception); } -double gem::hw::HwGenericAMC::getMMCMPhaseMean(uint32_t readAttempts) +double gem::hw::amc::HwGenericAMC::getMMCMPhaseMean(uint32_t readAttempts) { - if (readAttempts == 1) { - return double(readReg(getDeviceBaseNode(), "TTC.STATUS.CLK.TTC_PM_PHASE_MEAN")); - } else { - try { - req = wisc::RPCMsg("amc.getMMCMPhaseMean"); - req.set_word("reads", readAttempts); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - return rsp.get_word("phase"); - } STANDARD_CATCH; - } GEM_CATCH_RPC_ERROR("HwGenericAMC::getMMCMPhaseMean", gem::hw::devices::exception::Exception); - } + float res = 0.; + try { + res = xhal::common::rpc::call<::amc::ttc::getMMCMPhaseMean>(rpc, readAttempts); + } GEM_CATCH_RPC_ERROR("HwGenericAMC::getMMCMPhaseMean", gem::hw::devices::exception::Exception); + return static_cast(res); } -double gem::hw::HwGenericAMC::getMMCMPhaseMedian(uint32_t readAttempts) +double gem::hw::amc::HwGenericAMC::getMMCMPhaseMedian(uint32_t readAttempts) { CMSGEMOS_WARN("HwGenericAMC::getMMCMPhaseMedian is not implemented, returning the mean"); return getMMCMPhaseMean(readAttempts); } -double gem::hw::HwGenericAMC::getGTHPhaseMean(uint32_t readAttempts) +double gem::hw::amc::HwGenericAMC::getGTHPhaseMean(uint32_t readAttempts) { - if (readAttempts == 1) { - return readReg(getDeviceBaseNode(), "TTC.STATUS.CLK.GTH_PM_PHASE_MEAN"); - } else { - try { - req = wisc::RPCMsg("amc.getGTHPhaseMean"); - req.set_word("reads", readAttempts); - try { - rsp = rpc.call_method(req); - try { - if (rsp.get_key_exists("error")) { - std::stringstream errmsg; - errmsg << rsp.get_string("error"); - XCEPT_RAISE(gem::hw::devices::exception::RPCMethodError, errmsg.str()); - } - } STANDARD_CATCH; - return rsp.get_word("phase"); - } STANDARD_CATCH; - } GEM_CATCH_RPC_ERROR("HwGenericAMC::getGTHPhaseMean", gem::hw::devices::exception::Exception); - } + float res = 0.; + try { + res = xhal::common::rpc::call<::amc::ttc::getGTHPhaseMean>(rpc, readAttempts); + } GEM_CATCH_RPC_ERROR("HwGenericAMC::getGTHPhaseMean", gem::hw::devices::exception::Exception); + return static_cast(res); } -double gem::hw::HwGenericAMC::getGTHPhaseMedian(uint32_t readAttempts) +double gem::hw::amc::HwGenericAMC::getGTHPhaseMedian(uint32_t readAttempts) { CMSGEMOS_WARN("HwGenericAMC::getGTHPhaseMedian is not implemented, returning the mean"); return getGTHPhaseMean(readAttempts); } -void gem::hw::HwGenericAMC::ttcCounterReset() +void gem::hw::amc::HwGenericAMC::ttcCounterReset() { - writeReg(getDeviceBaseNode(), "TTC.CTRL.CNT_RESET", 0x1); + writeReg("GEM_AMC.TTC.CTRL.CNT_RESET", 0x1); } -bool gem::hw::HwGenericAMC::getL1AEnable() +bool gem::hw::amc::HwGenericAMC::getL1AEnable() { - return readReg(getDeviceBaseNode(), "TTC.CTRL.L1A_ENABLE"); + return readReg("GEM_AMC.TTC.CTRL.L1A_ENABLE"); } -void gem::hw::HwGenericAMC::setL1AEnable(bool enable) +void gem::hw::amc::HwGenericAMC::setL1AEnable(bool enable) { // uint32_t safeEnable = 0xa4a2c200+int(enable); - writeReg(getDeviceBaseNode(), "TTC.CTRL.L1A_ENABLE", uint32_t(enable)); + writeReg("GEM_AMC.TTC.CTRL.L1A_ENABLE", uint32_t(enable)); } -uint32_t gem::hw::HwGenericAMC::getTTCConfig(AMCTTCCommandT const& cmd) +uint32_t gem::hw::amc::HwGenericAMC::getTTCConfig(AMCTTCCommandT const& cmd) { CMSGEMOS_WARN("HwGenericAMC::getTTCConfig: not implemented"); return 0x0; } -void gem::hw::HwGenericAMC::setTTCConfig(AMCTTCCommandT const& cmd, uint8_t const& value) +void gem::hw::amc::HwGenericAMC::setTTCConfig(AMCTTCCommandT const& cmd, uint8_t const& value) { CMSGEMOS_WARN("HwGenericAMC::setTTCConfig: not implemented"); return; } -uint32_t gem::hw::HwGenericAMC::getTTCStatus() +uint32_t gem::hw::amc::HwGenericAMC::getTTCStatus() { CMSGEMOS_WARN("HwGenericAMC::getTTCStatus: not fully implemented"); - return readReg(getDeviceBaseNode(), "TTC.STATUS"); + return readReg("GEM_AMC.TTC.STATUS"); } -uint32_t gem::hw::HwGenericAMC::getTTCErrorCount(bool const& single) +uint32_t gem::hw::amc::HwGenericAMC::getTTCErrorCount(bool const& single) { if (single) - return readReg(getDeviceBaseNode(), "TTC.STATUS.TTC_SINGLE_ERROR_CNT"); + return readReg("GEM_AMC.TTC.STATUS.TTC_SINGLE_ERROR_CNT"); else - return readReg(getDeviceBaseNode(), "TTC.STATUS.TTC_DOUBLE_ERROR_CNT"); + return readReg("GEM_AMC.TTC.STATUS.TTC_DOUBLE_ERROR_CNT"); } -uint32_t gem::hw::HwGenericAMC::getTTCCounter(AMCTTCCommandT const& cmd) +uint32_t gem::hw::amc::HwGenericAMC::getTTCCounter(AMCTTCCommandT const& cmd) { switch(cmd) { case(AMCTTCCommand::TTC_L1A) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.L1A"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.L1A"); case(AMCTTCCommand::TTC_BC0) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.BC0"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.BC0"); case(AMCTTCCommand::TTC_EC0) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.EC0"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.EC0"); case(AMCTTCCommand::TTC_RESYNC) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.RESYNC"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.RESYNC"); case(AMCTTCCommand::TTC_OC0) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.OC0"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.OC0"); case(AMCTTCCommand::TTC_HARD_RESET) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.HARD_RESET"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.HARD_RESET"); case(AMCTTCCommand::TTC_CALPULSE) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.CALPULSE"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.CALPULSE"); case(AMCTTCCommand::TTC_START) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.START"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.START"); case(AMCTTCCommand::TTC_STOP) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.STOP"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.STOP"); case(AMCTTCCommand::TTC_TEST_SYNC) : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.TEST_SYNC"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.TEST_SYNC"); default : - return readReg(getDeviceBaseNode(), "TTC.CMD_COUNTERS.L1A"); + return readReg("GEM_AMC.TTC.CMD_COUNTERS.L1A"); } } -uint32_t gem::hw::HwGenericAMC::getL1AID() +uint32_t gem::hw::amc::HwGenericAMC::getL1AID() { - return readReg(getDeviceBaseNode(), "TTC.L1A_ID"); + return readReg("GEM_AMC.TTC.L1A_ID"); } -uint32_t gem::hw::HwGenericAMC::getL1ARate() +uint32_t gem::hw::amc::HwGenericAMC::getL1ARate() { - return readReg(getDeviceBaseNode(), "TTC.L1A_RATE"); + return readReg("GEM_AMC.TTC.L1A_RATE"); } -uint32_t gem::hw::HwGenericAMC::getTTCSpyBuffer() +uint32_t gem::hw::amc::HwGenericAMC::getTTCSpyBuffer() { // FIXME: OBSOLETE in V3? CMSGEMOS_WARN("HwGenericAMC::getTTCSpyBuffer: TTC.TTC_SPY_BUFFER is obsolete and will be removed in a future release"); return 0x0; - // return readReg(getDeviceBaseNode(), "TTC.TTC_SPY_BUFFER"); + // return readReg("GEM_AMC.TTC.TTC_SPY_BUFFER"); } /********************************/ @@ -817,134 +629,101 @@ uint32_t gem::hw::HwGenericAMC::getTTCSpyBuffer() /********************************/ /*** SCA submodule ***/ -void gem::hw::HwGenericAMC::scaHardResetEnable(bool const& en) +void gem::hw::amc::HwGenericAMC::scaHardResetEnable(bool const& en) { - writeReg(getDeviceBaseNode(), "SLOW_CONTROL.SCA.CTRL.TTC_HARD_RESET_EN", uint32_t(en)); + writeReg("GEM_AMC.SLOW_CONTROL.SCA.CTRL.TTC_HARD_RESET_EN", uint32_t(en)); } /********************************/ /** TRIGGER module information **/ /********************************/ -void gem::hw::HwGenericAMC::triggerReset() +void gem::hw::amc::HwGenericAMC::triggerReset() { - writeReg(getDeviceBaseNode(), "TRIGGER.CTRL.MODULE_RESET", 0x1); + writeReg("GEM_AMC.TRIGGER.CTRL.MODULE_RESET", 0x1); } -void gem::hw::HwGenericAMC::triggerCounterReset() +void gem::hw::amc::HwGenericAMC::triggerCounterReset() { - writeReg(getDeviceBaseNode(), "TRIGGER.CTRL.CNT_RESET", 0x1); + writeReg("GEM_AMC.TRIGGER.CTRL.CNT_RESET", 0x1); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridKillMask() +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridKillMask() { - return readReg(getDeviceBaseNode(), "TRIGGER.CTRL.OH_KILL_MASK"); + return readReg("GEM_AMC.TRIGGER.CTRL.OH_KILL_MASK"); } -void gem::hw::HwGenericAMC::setOptoHybridKillMask(uint32_t const& mask) +void gem::hw::amc::HwGenericAMC::setOptoHybridKillMask(uint32_t const& mask) { - writeReg(getDeviceBaseNode(), "TRIGGER.CTRL.OH_KILL_MASK", mask); + writeReg("GEM_AMC.TRIGGER.CTRL.OH_KILL_MASK", mask); } /*** STATUS submodule ***/ -uint32_t gem::hw::HwGenericAMC::getORTriggerRate() +uint32_t gem::hw::amc::HwGenericAMC::getORTriggerRate() { - return readReg(getDeviceBaseNode(), "TRIGGER.STATUS.OR_TRIGGER_RATE"); + return readReg("GEM_AMC.TRIGGER.STATUS.OR_TRIGGER_RATE"); } -uint32_t gem::hw::HwGenericAMC::getORTriggerCount() +uint32_t gem::hw::amc::HwGenericAMC::getORTriggerCount() { - return readReg(getDeviceBaseNode(), "TRIGGER.STATUS.TRIGGER_SINGLE_ERROR_CNT"); + return readReg("GEM_AMC.TRIGGER.STATUS.TRIGGER_SINGLE_ERROR_CNT"); } /*** OH{IDXX} submodule ***/ -uint32_t gem::hw::HwGenericAMC::getOptoHybridTriggerRate(uint8_t const& oh) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridTriggerRate(uint8_t const& oh) { - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.TRIGGER_RATE",(int)oh)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.TRIGGER_RATE",(int)oh)); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridTriggerCount(uint8_t const& oh) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridTriggerCount(uint8_t const& oh) { - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.TRIGGER_CNT",(int)oh)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.TRIGGER_CNT",(int)oh)); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridClusterRate(uint8_t const& oh, uint8_t const& cs) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridClusterRate(uint8_t const& oh, uint8_t const& cs) { - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.CLUSTER_SIZE_%d_RATE",(int)oh,(int)cs)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.CLUSTER_SIZE_%d_RATE",(int)oh,(int)cs)); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridClusterCount(uint8_t const& oh, uint8_t const& cs) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridClusterCount(uint8_t const& oh, uint8_t const& cs) { - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.CLUSTER_SIZE_%d_CNT",(int)oh,(int)cs)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.CLUSTER_SIZE_%d_CNT",(int)oh,(int)cs)); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridDebugLastCluster(uint8_t const& oh, uint8_t const& cs) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridDebugLastCluster(uint8_t const& oh, uint8_t const& cs) { - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.DEBUG_LAST_CLUSTER_%d",(int)oh,(int)cs)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.DEBUG_LAST_CLUSTER_%d",(int)oh,(int)cs)); } -uint32_t gem::hw::HwGenericAMC::getOptoHybridTriggerLinkCount(uint8_t const& oh, uint8_t const& link, AMCOHLinkCountT const& count) +uint32_t gem::hw::amc::HwGenericAMC::getOptoHybridTriggerLinkCount(uint8_t const& oh, uint8_t const& link, AMCOHLinkCountT const& count) { switch(count) { case(AMCOHLinkCount::LINK_NOT_VALID) : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_NOT_VALID_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_NOT_VALID_CNT",(int)oh,(int)link)); case(AMCOHLinkCount::LINK_MISSED_COMMA) : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_MISSED_COMMA_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_MISSED_COMMA_CNT",(int)oh,(int)link)); case(AMCOHLinkCount::LINK_OVERFLOW) : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_OVERFLOW_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_OVERFLOW_CNT",(int)oh,(int)link)); case(AMCOHLinkCount::LINK_UNDERFLOW) : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_UNDERFLOW_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_UNDERFLOW_CNT",(int)oh,(int)link)); case(AMCOHLinkCount::LINK_SYNC_WORD) : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_SYNC_WORD_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_SYNC_WORD_CNT",(int)oh,(int)link)); default : - return readReg(getDeviceBaseNode(), toolbox::toString("TRIGGER.OH%d.LINK%d_MISSED_COMMA_CNT",(int)oh,(int)link)); + return readReg("GEM_AMC."+toolbox::toString("TRIGGER.OH%d.LINK%d_MISSED_COMMA_CNT",(int)oh,(int)link)); } } // general resets -void gem::hw::HwGenericAMC::generalReset() +void gem::hw::amc::HwGenericAMC::generalReset() { // TODO: CTP7 module candidate // reset all counters - counterReset(); - - for (unsigned gtx = 0; gtx < m_maxLinks; ++gtx) - linkReset(gtx); - - // other resets - - return; -} - -void gem::hw::HwGenericAMC::counterReset() -{ - // TODO: CTP7 module candidate - // reset all counters - resetT1Counters(); - - linkCounterReset(); - - return; -} - -void gem::hw::HwGenericAMC::resetT1Counters() -{ - // TODO: CTP7 module candidate - // FIXME: OBSOLETE in V3 - CMSGEMOS_WARN("HwGenericAMC::resetT1Counters is obsolete and will be removed in a future release"); - return; -} - -void gem::hw::HwGenericAMC::linkCounterReset() -{ - // TODO: CTP7 module candidate - // FIXME: OBSOLETE in V3? - CMSGEMOS_WARN("HwGenericAMC::linkCounterReset: not yet implemented"); + CMSGEMOS_WARN("HwGenericAMC::generalReset: not yet implemented"); return; } -void gem::hw::HwGenericAMC::linkReset(uint8_t const& gtx) +void gem::hw::amc::HwGenericAMC::linkReset(uint8_t const& gtx) { // TODO: CTP7 module candidate // req = wisc::RPCMsg("amc.linkReset"); @@ -961,6 +740,5 @@ void gem::hw::HwGenericAMC::linkReset(uint8_t const& gtx) // } STANDARD_CATCH; CMSGEMOS_WARN("HwGenericAMC::linkReset: not yet implemented"); - linkCounterReset(); return; } diff --git a/gemhardware/devices/src/common/glib/HwGLIB.cc b/gemhardware/devices/src/common/glib/HwGLIB.cc deleted file mode 100644 index 8945efd4..00000000 --- a/gemhardware/devices/src/common/glib/HwGLIB.cc +++ /dev/null @@ -1,325 +0,0 @@ -#include - -#include "gem/hw/devices/glib/HwGLIB.h" - -#include "gem/hw/devices/exception/Exception.h" - -gem::hw::glib::HwGLIB::HwGLIB(std::string const& glibDevice, - std::string const& connectionFile) : - gem::hw::HwGenericAMC::HwGenericAMC(glibDevice, connectionFile) -{ - CMSGEMOS_INFO("HwGLIB::HwGLIB trying to create HwGLIB(" << glibDevice << "," << connectionFile); - - // this->setDeviceBaseNode("GEM_AMC"); - this->setExpectedBoardID("GLIB"); - - CMSGEMOS_INFO("HwGLIB::HwGLIB ctor done " << isHwConnected()); -} - -gem::hw::glib::HwGLIB::HwGLIB(std::string const& glibDevice, - std::string const& connectionURI, - std::string const& addressTable) : - gem::hw::HwGenericAMC::HwGenericAMC(glibDevice, connectionURI, addressTable) - -{ - CMSGEMOS_INFO("HwGLIB::HwGLIB trying to create HwGLIB(" << glibDevice << "," << connectionURI << "," <setDeviceBaseNode("GEM_AMC"); - this->setExpectedBoardID("GLIB"); - - CMSGEMOS_INFO("HwGLIB::HwGLIB ctor done " << isHwConnected()); -} - -gem::hw::glib::HwGLIB::HwGLIB(std::string const& glibDevice, - uhal::HwInterface& uhalDevice) : - gem::hw::HwGenericAMC::HwGenericAMC(glibDevice,uhalDevice) -{ - CMSGEMOS_INFO("HwGLIB::HwGLIB ctor"); - - // this->setDeviceBaseNode("GEM_AMC"); - this->setExpectedBoardID("GLIB"); - - CMSGEMOS_INFO("HwGLIB::HwGLIB ctor done " << isHwConnected()); -} - -// gem::hw::glib::HwGLIB::HwGLIB(const int& crate, const int& slot) : -// gem::hw::HwGenericAMC(toolbox::toString("gem.shelf%02d.glib%02d",crate,slot),crate,slot) -// // monGLIB_(0), -// { -// CMSGEMOS_INFO("HwGLIB ctor"); - -// // use a connection file and connection manager? -// setDeviceID(toolbox::toString("gem.shelf%02d.glib%02d",crate,slot)); - -// // uhal::ConnectionManager manager ( "file://${GEM_ADDRESS_TABLE_PATH}/connections.xml" ); -// CMSGEMOS_INFO("getting the ConnectionManager pointer"); -// p_gemConnectionManager.reset(new uhal::ConnectionManager("file://${GEM_ADDRESS_TABLE_PATH}/connections.xml")); -// CMSGEMOS_INFO("getting HwInterface " << getDeviceID() << " pointer from ConnectionManager"); -// p_gemHW.reset(new uhal::HwInterface(p_gemConnectionManager->getDevice(this->getDeviceID()))); -// CMSGEMOS_INFO("setting the device base node"); -// setDeviceBaseNode("GEM_AMC"); -// setExpectedBoardID("GLIB"); - -// // setLogLevelTo(uhal::Error()); // Minimise uHAL logging - -// for (unsigned li = 0; li < N_GTX; ++li) { -// AMCIPBusCounters tmpGTXCounter; -// m_ipBusCounters.push_back(tmpGTXCounter); -// } - -// CMSGEMOS_INFO("HwGLIB ctor done " << isHwConnected()); -// } - -gem::hw::glib::HwGLIB::~HwGLIB() -{ -} - -std::string gem::hw::glib::HwGLIB::getBoardIDString() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - // The board ID consists of four characters encoded as a 32-bit unsigned int - std::string res = "N/A"; - res = gem::utils::uint32ToString(getBoardID()); - return res; -} - -uint32_t gem::hw::glib::HwGLIB::getBoardID() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - // The board ID consists of four characters encoded as a 32-bit unsigned int - uint32_t val = readReg(getDeviceBaseNode(), "GLIB_SYSTEM.SYSTEM.BOARD_ID"); - return val; -} - -std::string gem::hw::glib::HwGLIB::getSystemIDString() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - // The system ID consists of four characters encoded as a 32-bit unsigned int - std::string res = "N/A"; - res = gem::utils::uint32ToString(getSystemID()); - return res; -} - -uint32_t gem::hw::glib::HwGLIB::getSystemID() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - // The system ID consists of four characters encoded as a 32-bit unsigned int - uint32_t val = readReg(getDeviceBaseNode(), "GLIB_SYSTEM.SYSTEM.SYSTEM_ID"); - return val; -} - -std::string gem::hw::glib::HwGLIB::getIPAddressString() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::string res = "N/A"; - res = gem::utils::uint32ToDottedQuad(getIPAddress()); - return res; -} - -uint32_t gem::hw::glib::HwGLIB::getIPAddress() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - uint32_t val = readReg(getDeviceBaseNode(), "GLIB_SYSTEM.SYSTEM.IP_INFO"); - return val; -} - -std::string gem::hw::glib::HwGLIB::getMACAddressString() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::string res = "N/A"; - uint64_t val = getMACAddress(); - res = gem::utils::uint32ToGroupedHex((val>>32)&0xffffffff,val&0xffffffff); - // res = gem::utils::uint64ToGroupedHex(val); - return res; -} - -uint64_t gem::hw::glib::HwGLIB::getMACAddress() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - uint32_t val1 = readReg(getDeviceBaseNode(), "GLIB_SYSTEM.SYSTEM.MAC.UPPER"); - uint32_t val2 = readReg(getDeviceBaseNode(), "GLIB_SYSTEM.SYSTEM.MAC.LOWER"); - return ((uint64_t)val1 << 32) + val2; -} - -void gem::hw::glib::HwGLIB::XPointControl(bool xpoint2, uint8_t const& input, uint8_t const& output) -{ - if (xpoint2 && (input > 2 || output > 0)) { - std::string msg = toolbox::toString("Invalid clock routing for XPoint2 %d -> %d",input,output); - CMSGEMOS_ERROR(msg); - // XCEPT_RAISE(gem::hw::devices::exception::InvalidXPoint2Routing,msg); - return; - } - - if ((input > 3 || output > 3)) { - std::string msg = toolbox::toString( "Invalid clock routing for XPoint%d %d -> %d",xpoint2,input,output); - CMSGEMOS_ERROR(msg); - // XCEPT_RAISE(gem::hw::devices::exception::InvalidXPointRouting,msg); - return; - } - - std::stringstream regName; - if (xpoint2) - regName << "GLIB_SYSTEM.SYSTEM.CLK_CTRL.XPOINT2"; - else - regName << "GLIB_SYSTEM.SYSTEM.CLK_CTRL.XPOINT1"; - - switch(output) { - case (0) : - regName << ".S1"; - case (1) : - regName << ".S2"; - case (2) : - regName << ".S3"; - case (3) : - regName << ".S4"; - } - // input = b7b6b5b4b3b2b1b0 and all that matter are b1 and b0 -> 1 and 0 of, eg., S1 - // input == 0 -> b1b0 == 00 - // input == 1 -> b1b0 == 01 - // input == 2 -> b1b0 == 10 - // input == 3 -> b1b0 == 11 - // but the xpoint switch inverts b0 and b1 when routing outputs - // thus to select input 3 for output 1, one sets S10=1 and S11=0 - writeReg(getDeviceBaseNode(),regName.str()+"1",input&0x01); - writeReg(getDeviceBaseNode(),regName.str()+"0",(input&0x10)>>1); -} - -uint8_t gem::hw::glib::HwGLIB::XPointControl(bool xpoint2, uint8_t const& output) -{ - /* - if (xpoint2 && output > 0) { - std::string msg = toolbox::toString("Invalid clock output for XPoint2 %d",output); - CMSGEMOS_ERROR(msg); - // XCEPT_RAISE(gem::hw::devices::exception::InvalidXPoint2Routing,msg); - return output; - } - */ - - if (output > 3) { - std::string msg = toolbox::toString( "Invalid clock output for XPoint%d %d",xpoint2,output); - CMSGEMOS_ERROR(msg); - // XCEPT_RAISE(gem::hw::devices::exception::InvalidXPointRouting,msg); - return output; - } - - std::stringstream regName; - if (xpoint2) - regName << "GLIB_SYSTEM.SYSTEM.CLK_CTRL.XPOINT2"; - else - regName << "GLIB_SYSTEM.SYSTEM.CLK_CTRL.XPOINT1"; - - switch(output) { - case (0) : - regName << ".S1"; - case (1) : - regName << ".S2"; - case (2) : - regName << ".S3"; - case (3) : - regName << ".S4"; - } - uint8_t input = 0x0; - input |= (readReg(getDeviceBaseNode(),regName.str()+"0")&0x1)<<1; - // input = input << 1; - input |= (readReg(getDeviceBaseNode(),regName.str()+"1")&0x1); - return input; -} - -uint8_t gem::hw::glib::HwGLIB::SFPStatus(uint8_t const& sfpcage) -{ - // gem::utils::LockGuard guardedLock(hwLock_); - if (sfpcage < 1 || sfpcage > 4) { - std::string msg = toolbox::toString("Status requested for SFP (%d): outside expectation (1,4)", sfpcage); - CMSGEMOS_ERROR(msg); - // XCEPT_RAISE(gem::hw::devices::exception::InvalidLink,msg); - return 0; - } - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.SFP" << (int)sfpcage << ".STATUS"; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()); -} - -bool gem::hw::glib::HwGLIB::FMCPresence(bool fmc2) -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.FMC" << (int)fmc2+1 << "_PRESENT"; - return (bool)readReg(getDeviceBaseNode(),regName.str()); -} - -bool gem::hw::glib::HwGLIB::GbEInterrupt() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.GBE_INT"; - return (bool)readReg(getDeviceBaseNode(),regName.str()); -} - -bool gem::hw::glib::HwGLIB::FPGAResetStatus() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.FPGA_RESET"; - return (bool)readReg(getDeviceBaseNode(),regName.str()); -} - -uint8_t gem::hw::glib::HwGLIB::V6CPLDStatus() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.V6_CPLD"; - return (uint8_t)readReg(getDeviceBaseNode(),regName.str()); -} - -bool gem::hw::glib::HwGLIB::CDCELockStatus() -{ - // gem::utils::LockGuard guardedLock(hwLock_); - std::stringstream regName; - regName << "GLIB_SYSTEM.SYSTEM.STATUS.CDCE_LOCK"; - return static_cast(readReg(getDeviceBaseNode(),regName.str())); -} - -/** only for compatibility with some functions, will be removed **/ -uint32_t gem::hw::glib::HwGLIB::getFIFOOccupancy(uint8_t const& gtx) -{ - // FIXME OBSOLETE!!! - return 0x0; -} - -uint32_t gem::hw::glib::HwGLIB::getFIFOVFATBlockOccupancy(uint8_t const& gtx) -{ - // FIXME OBSOLETE!!! - return 0x0; -} - -bool gem::hw::glib::HwGLIB::hasTrackingData(uint8_t const& gtx) -{ - // FIXME OBSOLETE!!! - return false; -} - -std::vector gem::hw::glib::HwGLIB::getTrackingData(uint8_t const& gtx, size_t const& nBlocks) -{ - // FIXME OBSOLETE!!! - std::vector res; - return res; -} - -uint32_t gem::hw::glib::HwGLIB::getTrackingData(uint8_t const& gtx, uint32_t* data, size_t const& nBlocks) -{ - // FIXME OBSOLETE!!! - return 0x0; -} - -// uint32_t gem::hw::glib::HwGLIB::getTrackingData(uint8_t const& gtx, std::vector& data, -// size_t const& nBlocks) -// { -// // FIXME OBSOLETE!!! -// return 0x0; -// } - -void gem::hw::glib::HwGLIB::flushFIFO(uint8_t const& gtx) -{ - // FIXME OBSOLETE!!! - return; -} diff --git a/gemhardware/devices/src/common/optohybrid/HwOptoHybrid.cc b/gemhardware/devices/src/common/optohybrid/HwOptoHybrid.cc index 7b462095..0d769d3b 100644 --- a/gemhardware/devices/src/common/optohybrid/HwOptoHybrid.cc +++ b/gemhardware/devices/src/common/optohybrid/HwOptoHybrid.cc @@ -5,72 +5,18 @@ #include #include "gem/hw/devices/optohybrid/HwOptoHybrid.h" -#include "gem/hw/devices/amc/HwGenericAMC.h" +#include "ctp7_modules/common/gbt.h" +#include "ctp7_modules/common/vfat3.h" +#include "ctp7_modules/common/optohybrid.h" -gem::hw::optohybrid::HwOptoHybrid::HwOptoHybrid(std::string const& optohybridDevice, - std::string const& connectionFile) : - gem::hw::GEMHwDevice::GEMHwDevice(optohybridDevice, connectionFile), +gem::hw::optohybrid::HwOptoHybrid::HwOptoHybrid(std::string const& optohybridDevice) : + gem::hw::GEMHwDevice::GEMHwDevice(optohybridDevice), b_is_initial(true), m_link(extractDeviceID(optohybridDevice,3)) { this->setup(optohybridDevice); std::stringstream basenode; basenode << "GEM_AMC.OH.OH" << static_cast(m_link); - this->setDeviceBaseNode(basenode.str()); - CMSGEMOS_INFO("HwOptoHybrid ctor done (basenode " - << basenode.str() << ") " << isHwConnected()); -} - -gem::hw::optohybrid::HwOptoHybrid::HwOptoHybrid(std::string const& optohybridDevice, - std::string const& connectionURI, - std::string const& addressTable) : - gem::hw::GEMHwDevice::GEMHwDevice(optohybridDevice, connectionURI, addressTable), - b_is_initial(true), - m_link(extractDeviceID(optohybridDevice,3)) -{ - this->setup(optohybridDevice); - // FIXME HARDCODED OBSOLETE - this->setAddressTableFileName(toolbox::toString("uhal_gem_amc_glib_link%02d.xml",m_link)); - std::stringstream basenode; - basenode << "GEM_AMC.OH.OH" << static_cast(m_link); - this->setDeviceBaseNode(basenode.str()); - CMSGEMOS_INFO("HwOptoHybrid ctor done (basenode " - << basenode.str() << ") " << isHwConnected()); -} - -gem::hw::optohybrid::HwOptoHybrid::HwOptoHybrid(std::string const& optohybridDevice, - uhal::HwInterface& uhalDevice) : - gem::hw::GEMHwDevice::GEMHwDevice(optohybridDevice,uhalDevice), - b_is_initial(true), - m_link(extractDeviceID(optohybridDevice,3)) -{ - this->setup(optohybridDevice); - std::stringstream basenode; - basenode << "GEM_AMC.OH.OH" << static_cast(m_link); - this->setDeviceBaseNode(basenode.str()); - CMSGEMOS_INFO("HwOptoHybrid ctor done (basenode " - << basenode.str() << ") " << isHwConnected()); -} - -gem::hw::optohybrid::HwOptoHybrid::HwOptoHybrid(gem::hw::HwGenericAMC const& amcDevice, - uint8_t const& slot) : - gem::hw::GEMHwDevice::GEMHwDevice(toolbox::toString("%s.OptoHybrid_%d",(amcDevice.getLoggerName()).c_str(), - static_cast(slot)), - dynamic_cast(amcDevice)), - b_is_initial(true), - m_link(static_cast(slot)) -{ - CMSGEMOS_INFO("HwOptoHybrid creating OptoHybrid device from AMC device " << amcDevice.getLoggerName()); - // Use a connection file and connection manager? - setDeviceID(toolbox::toString("%s.optohybrid%02d",amcDevice.getDeviceID().c_str(),static_cast(m_link))); - // uhal::ConnectionManager manager ( "file://${GEM_ADDRESS_TABLE_PATH}/connections.xml" ); - // p_gemConnectionManager.reset(new uhal::ConnectionManager("file://${GEM_ADDRESS_TABLE_PATH}/connections.xml")); - // p_gemHW.reset(new uhal::HwInterface(p_gemConnectionManager->getDevice(this->getDeviceID()))); - // p_gemConnectionManager = std::shared_ptr(uhal::ConnectionManager("file://${GEM_ADDRESS_TABLE_PATH}/connections.xml")); - // p_gemHW = std::shared_ptr(p_gemConnectionManager->getDevice(this->getDeviceID())); - std::stringstream basenode; - basenode << "GEM_AMC.OH.OH" << static_cast(m_link); - this->setDeviceBaseNode(basenode.str()); CMSGEMOS_INFO("HwOptoHybrid ctor done (basenode " << basenode.str() << ") " << isHwConnected()); } @@ -81,25 +27,10 @@ gem::hw::optohybrid::HwOptoHybrid::~HwOptoHybrid() // Disable connection to RPC service? } -//void gem::hw::optohybrid::HwOptoHybrid::configureDevice(std::string const& xmlSettings) -//{ -// //here load the xml file settings onto the board -//} -// -//void gem::hw::optohybrid::HwOptoHybrid::configureDevice(gem::config::OptoHybridBLOB const& blob) -//{ -// -//} -// -//void gem::hw::optohybrid::HwOptoHybrid::configureDevice() -//{ -// // determine the manner in which to configure the device (XML or DB parameters) -//} -// - void gem::hw::optohybrid::HwOptoHybrid::connectRPC(bool reconnect) { if (isConnected) { + this->gem::hw::GEMHwDevice::connectRPC(); this->loadModule("optohybrid", "optohybrid v1.0.1"); this->loadModule("vfat3", "vfat3 v1.0.1"); this->loadModule("gbt", "gbt v1.0.1"); @@ -153,7 +84,7 @@ bool gem::hw::optohybrid::HwOptoHybrid::isHwConnected() uint32_t gem::hw::optohybrid::HwOptoHybrid::getFirmwareVersion() { - uint32_t fwver = readReg(getDeviceBaseNode(),"FPGA.CONTROL.RELEASE.VERSION"); + uint32_t fwver = readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.CONTROL.RELEASE.VERSION"); CMSGEMOS_TRACE("OH has firmware version 0x" << std::hex << fwver << std::dec << std::endl); return fwver; } @@ -173,7 +104,7 @@ std::string gem::hw::optohybrid::HwOptoHybrid::getFirmwareVersionString() uint32_t gem::hw::optohybrid::HwOptoHybrid::getFirmwareDate() { - uint32_t fwver = readReg(getDeviceBaseNode(),"FPGA.CONTROL.RELEASE.DATE"); + uint32_t fwver = readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.CONTROL.RELEASE.DATE"); CMSGEMOS_TRACE("OH has firmware date 0x" << std::hex << fwver << std::dec << std::endl); return fwver; } @@ -193,19 +124,8 @@ std::vector gem::hw::optohybrid::HwOptoHybrid::broadcastRead(std::stri bool const& reset) { try { - req = wisc::RPCMsg("optohybrid.broadcastRead"); - req.set_string("reg_name", name); - req.set_word("ohN", static_cast(m_link)); - req.set_word("mask", mask); - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::broadcastRead"); - uint32_t size = rsp.get_word_array_size("data"); - std::vector data; - data.resize(size); - rsp.get_word_array("data", data.data()); - return data; + auto res = xhal::common::rpc::call<::oh::broadcastRead>(rpc, static_cast(m_link), name, mask); + return res; } GEM_CATCH_RPC_ERROR("HwOptoHybrid::broadcastRead", gem::hw::devices::exception::Exception); } @@ -215,15 +135,7 @@ void gem::hw::optohybrid::HwOptoHybrid::broadcastWrite(std::string const& name, bool const& reset) { try { - req = wisc::RPCMsg("optohybrid.broadcastWrite"); - req.set_string("reg_name", name); - req.set_word("ohN", static_cast(m_link)); - req.set_word("mask", mask); - req.set_word("value", value); - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::broadcastWrite"); + xhal::common::rpc::call<::oh::broadcastWrite>(rpc, static_cast(m_link), name, value, mask); } GEM_CATCH_RPC_ERROR("HwOptoHybrid::broadcastWrite", gem::hw::devices::exception::Exception); } @@ -232,18 +144,9 @@ std::vector > gem::hw::optohybrid::HwOptoHybrid::ge { // FIXME UPDATE WITH NEW COMM PROTOCOL if (update || b_is_initial) { - std::vector loc_chipIDs; + std::vector loc_chipIDs(::oh::VFATS_PER_OH,0xdeaddead); try { - req = wisc::RPCMsg("vfat3.getVFAT3ChipIDs"); - req.set_word("ohN", static_cast(m_link)); - req.set_word("mask", 0x0); // FIXME mandatory, need to redesign ctp7_modules - req.set_word("rawID", false); - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::getVFAT3ChipIDs"); - loc_chipIDs.resize(rsp.get_word_array_size("chipIDs")); // FIXME should be 24 - rsp.get_word_array("chipIDs", loc_chipIDs.data()); + loc_chipIDs = xhal::common::rpc::call<::vfat3::getVFAT3ChipIDs>(rpc, static_cast(m_link), 0x0, false); //FIXME hardcoded mask (obsolete param) and rawID } GEM_CATCH_RPC_ERROR("HwOptoHybrid::getVFAT3ChipIDs", gem::hw::devices::exception::Exception); // std::vector loc_chipIDs = broadcastRead("HW_CHIP_ID", gem::hw::utils::ALL_VFATS_BCAST_MASK, false); @@ -271,13 +174,7 @@ uint32_t gem::hw::optohybrid::HwOptoHybrid::getConnectedVFATMask(bool update) // change to vfatSyncCheck? uint32_t goodVFATs = 0x0; try { - req = wisc::RPCMsg("vfat3.vfatSyncCheck"); - req.set_word("ohN", static_cast(m_link)); - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::getConnectedVFATMask"); - goodVFATs = rsp.get_word("goodVFATs"); + goodVFATs = xhal::common::rpc::call<::vfat3::vfatSyncCheck>(rpc, static_cast(m_link), 0x0); //FIXME hardcoded mask } GEM_CATCH_RPC_ERROR("HwOptoHybrid::getConnectedVFATMask", gem::hw::devices::exception::Exception); uint32_t connectedMask = goodVFATs; // FIXME high means broadcast, present @@ -305,14 +202,7 @@ void gem::hw::optohybrid::HwOptoHybrid::setVFATsToDefaults() void gem::hw::optohybrid::HwOptoHybrid::configureVFATs() { try { - req = wisc::RPCMsg("vfat3.configureVFAT3s"); - req.set_word("ohN", static_cast(m_link)); - req.set_word("vfatMask", ~m_connectedMask); // FIXME REMOVE - req.set_word("useRAM", false); // FIXME false until RAM loading is implemented - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::configureVFATs"); + xhal::common::rpc::call<::vfat3::configureVFAT3s>(rpc, static_cast(m_link), ~m_connectedMask); //FIXME remove requirement for mask TODO implement option for RAM loading } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureVFATs", gem::hw::devices::exception::Exception); } @@ -325,80 +215,59 @@ void gem::hw::optohybrid::HwOptoHybrid::setVFATsToDefaults(std::map const& regvals) { - try { - req = wisc::RPCMsg("vfat3.configureVFAT3s"); - req.set_word("ohN", static_cast(m_link)); - // req.set_word("vfatMask", m_connectedMask); // FIXME REMOVE - req.set_word("useRAM", false); - std::array cfgdata{0}; - req.set_binarydata("config", cfgdata.data(), cfgdata.size()); - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::configureVFATs"); - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureVFATs", gem::hw::devices::exception::Exception); + //FIXME not implemented. Do we actually need it?? + //try { + // req = wisc::RPCMsg("vfat3.configureVFAT3s"); + // req.set_word("ohN", static_cast(m_link)); + // // req.set_word("vfatMask", m_connectedMask); // FIXME REMOVE + // req.set_word("useRAM", false); + // std::array cfgdata{0}; + // req.set_binarydata("config", cfgdata.data(), cfgdata.size()); + // try { + // rsp = rpc.call_method(req); + // } STANDARD_CATCH; + // checkRPCResponse("HwOptoHybrid::configureVFATs"); + //} GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureVFATs", gem::hw::devices::exception::Exception); } - -void gem::hw::optohybrid::HwOptoHybrid::configureGBT(uint8_t const& gbtID, uint32_t const* gbtcfg) +void gem::hw::optohybrid::HwOptoHybrid::configureGBT(const uint8_t& gbtID, const gbt::config_t& gbtcfg) { try { - req = wisc::RPCMsg("gbt.writeGBTConfig"); - req.set_word("ohN", static_cast(m_link)); - req.set_word("gbtN", static_cast(gbtID)); - req.set_word("useRAM", false); - // std::array cfgdata{0}; - // cfgdata.resize(3*92); - // req.set_binarydata("config", cfgdata.data(), cfgdata.size()); - req.set_binarydata("config", gbtcfg, 92); // FIXME how to guarantee size? - /** - // or, with one blob per GBTx - std::array, 3> cfgdata{}; - req.set_binarydata("gbt0", cfgdata.at(0).data(), cfgdata.at(0).size()); - req.set_binarydata("gbt1", cfgdata.at(1).data(), cfgdata.at(1).size()); - req.set_binarydata("gbt2", cfgdata.at(2).data(), cfgdata.at(2).size()); - */ - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::configureAllGBTs"); - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureAllGBTs", gem::hw::devices::exception::Exception); -} + xhal::common::rpc::call<::gbt::writeGBTConfig>(rpc, static_cast(m_link), static_cast(gbtID), gbtcfg); + } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureGBT", gem::hw::devices::exception::Exception); - -void gem::hw::optohybrid::HwOptoHybrid::configureGBT(uint8_t const& gbtID, std::array const& gbtcfg) -{ - configureGBT(gbtID, gbtcfg.data()); } void gem::hw::optohybrid::HwOptoHybrid::configureAllGBTs(uint32_t const* gbtcfg) { - try { - req = wisc::RPCMsg("gbt.writeAllGBTConfigs"); - req.set_word("ohN", static_cast(m_link)); - req.set_word("useRAM", false); - // std::array cfgdata{0}; - // cfgdata.resize(3*92); - // req.set_binarydata("config", cfgdata.data(), cfgdata.size()); - req.set_binarydata("config", gbtcfg, 3*92); // FIXME how to guarantee size? - /** - // or, with one blob per GBTx - std::array, 3> cfgdata{}; - req.set_binarydata("gbt0", cfgdata.at(0).data(), cfgdata.at(0).size()); - req.set_binarydata("gbt1", cfgdata.at(1).data(), cfgdata.at(1).size()); - req.set_binarydata("gbt2", cfgdata.at(2).data(), cfgdata.at(2).size()); - */ - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::configureAllGBTs"); - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureAllGBTs", gem::hw::devices::exception::Exception); + //FIXME not implemented on the RPC side, also not used anywhere in cmsgemos +// try { +// req = wisc::RPCMsg("gbt.writeAllGBTConfigs"); +// req.set_word("ohN", static_cast(m_link)); +// req.set_word("useRAM", false); +// // std::array cfgdata{0}; +// // cfgdata.resize(3*92); +// // req.set_binarydata("config", cfgdata.data(), cfgdata.size()); +// req.set_binarydata("config", gbtcfg, 3*92); // FIXME how to guarantee size? +// /** +// // or, with one blob per GBTx +// std::array, 3> cfgdata{}; +// req.set_binarydata("gbt0", cfgdata.at(0).data(), cfgdata.at(0).size()); +// req.set_binarydata("gbt1", cfgdata.at(1).data(), cfgdata.at(1).size()); +// req.set_binarydata("gbt2", cfgdata.at(2).data(), cfgdata.at(2).size()); +// */ +// try { +// rsp = rpc.call_method(req); +// } STANDARD_CATCH; +// checkRPCResponse("HwOptoHybrid::configureAllGBTs"); +// } GEM_CATCH_RPC_ERROR("HwOptoHybrid::configureAllGBTs", gem::hw::devices::exception::Exception); } void gem::hw::optohybrid::HwOptoHybrid::configureAllGBTs(std::array const& gbtcfg) { + //FIXME not implemented on the RPC side, also not used anywhere in cmsgemos configureAllGBTs(gbtcfg.data()); } @@ -445,23 +314,23 @@ void gem::hw::optohybrid::HwOptoHybrid::setVFATMask(uint32_t const mask) void gem::hw::optohybrid::HwOptoHybrid::resetVFATs() { - return writeReg(getDeviceBaseNode(),"FPGA.CONTROL.VFAT.RESET",0x1); + return writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.CONTROL.VFAT.RESET",0x1); } void gem::hw::optohybrid::HwOptoHybrid::setSBitMask(uint32_t const mask) { - writeReg(getDeviceBaseNode(),"FPGA.TRIG.CTRL.VFAT_MASK", mask&0x00ffffff); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.TRIG.CTRL.VFAT_MASK", mask&0x00ffffff); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getSBitMask() { - return readReg(getDeviceBaseNode(),"FPGA.TRIG.CTRL.VFAT_MASK"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.TRIG.CTRL.VFAT_MASK"); } //// HDMI_OUTPUT \\\\* void gem::hw::optohybrid::HwOptoHybrid::setHDMISBitSource(uint8_t const& bit, uint8_t const& mode) { - writeReg(getDeviceBaseNode(),toolbox::toString("FPGA.CONTROL.HDMI.SBIT_SEL%i",static_cast(bit)),mode); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("FPGA.CONTROL.HDMI.SBIT_SEL%i",static_cast(bit)),mode); } void gem::hw::optohybrid::HwOptoHybrid::setHDMISBitSource(std::array const& sources) @@ -472,75 +341,75 @@ void gem::hw::optohybrid::HwOptoHybrid::setHDMISBitSource(std::array uint32_t gem::hw::optohybrid::HwOptoHybrid::getHDMISBitSource(uint8_t const& bit) { - return readReg(getDeviceBaseNode(),toolbox::toString("FPGA.CONTROL.HDMI.SBIT_SEL%i",static_cast(bit))); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("FPGA.CONTROL.HDMI.SBIT_SEL%i",static_cast(bit))); } void gem::hw::optohybrid::HwOptoHybrid::setHDMISBitMode(uint8_t const& bit, uint8_t const& mode) { - writeReg(getDeviceBaseNode(),toolbox::toString("FPGA.CONTROL.HDMI.SBIT_MODE%i",static_cast(bit)), mode); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("FPGA.CONTROL.HDMI.SBIT_MODE%i",static_cast(bit)), mode); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getHDMISBitMode(uint8_t const& bit) { - return readReg(getDeviceBaseNode(),toolbox::toString("FPGA.CONTROL.HDMI.SBIT_MODE%i",static_cast(bit))); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("FPGA.CONTROL.HDMI.SBIT_MODE%i",static_cast(bit))); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getClockStatus() { - return readReg(getDeviceBaseNode(),"FPGA.CLOCKING"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.CLOCKING"); } //////// Firmware Status \\\\\\\\* bool gem::hw::optohybrid::HwOptoHybrid::hasSEUError() { - return readReg(getDeviceBaseNode(),"STATUS.SEU"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".STATUS.SEU"); } //////// OptoHybrid ADC Interface \\\\\\\\* // FIXME UPDATE FOR V3 uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGATemp() { - return readReg(getDeviceBaseNode(),"ADC.TEMP"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.TEMP"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMaxTemp() { - return readReg(getDeviceBaseNode(),"ADC.TEMP.MAX"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.TEMP.MAX"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMinTemp() { - return readReg(getDeviceBaseNode(),"ADC.TEMP.MIN"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.TEMP.MIN"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAVccInt() { - return readReg(getDeviceBaseNode(),"ADC.VCCINT"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCINT"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMaxVccInt() { - return readReg(getDeviceBaseNode(),"ADC.VCCINT.MAX"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCINT.MAX"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMinVccInt() { - return readReg(getDeviceBaseNode(),"ADC.VCCINT.MIN"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCINT.MIN"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAVccAux() { - return readReg(getDeviceBaseNode(),"ADC.VCCAUX"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCAUX"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMaxVccAux() { - return readReg(getDeviceBaseNode(),"ADC.VCCAUX.MAX"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCAUX.MAX"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getFPGAMinVccAux() { - return readReg(getDeviceBaseNode(),"ADC.VCCAUX.MIN"); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".ADC.VCCAUX.MIN"); } uint32_t gem::hw::optohybrid::HwOptoHybrid::getADCVPVN() const @@ -569,121 +438,26 @@ uint32_t gem::hw::optohybrid::HwOptoHybrid::getVFATDACOutI(uint8_t const& column return 0xdead; } -//////// Scan Modules \\\\\\\\* -void gem::hw::optohybrid::HwOptoHybrid::configureScanModule(uint8_t const& mode, uint32_t const& chip, uint8_t const& channel, - uint8_t const& min, uint8_t const& max, - uint8_t const& step, uint32_t const& nevts, - bool useUltra, bool reset) -{ - try { - req = wisc::RPCMsg("optohybrid.configureScanModule"); - req.set_word("ohN",static_cast(m_link)); - req.set_word("useUltra",useUltra); - - if (useUltra) { - req.set_word("mask",chip); - } else { - req.set_word("vfat",chip); - } - - req.set_word("mode", mode); - req.set_word("ch", channel); - req.set_word("nevts", nevts); - req.set_word("dacMin", min); - req.set_word("dacMax", max); - req.set_word("dacStep",step); - // req.set_word("reset",reset); - - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::broadcastWrite"); - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::startScanModule", gem::hw::devices::exception::Exception); -} - -void gem::hw::optohybrid::HwOptoHybrid::startScanModule(uint32_t const& nevts, bool useUltra) -{ - try { - req = wisc::RPCMsg("optohybrid.startScanModule"); - req.set_word("ohN", static_cast(m_link)); - // req.set_word("nevts", nevts); - req.set_word("useUltra", useUltra); - - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::broadcastWrite"); - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::startScanModule", gem::hw::devices::exception::Exception); -} - -std::vector gem::hw::optohybrid::HwOptoHybrid::getScanResults(uint32_t const& nevts, - uint32_t const& min, - uint32_t const& max, - uint32_t const& step) -{ - // FIXME OBSOLETE IN V3 - CMSGEMOS_WARN("HwOptoHybrid::getScanResults is obsolete"); - return getUltraScanResults(nevts, min, max, step).at(0); -} - -std::vector > gem::hw::optohybrid::HwOptoHybrid::getUltraScanResults(uint32_t const& nevts, - uint32_t const& min, - uint32_t const& max, - uint32_t const& step) -{ - try { - req = wisc::RPCMsg("optohybrid.getUltraScanResults"); - req.set_word("ohN", static_cast(m_link)); - req.set_word("nevts", nevts); - req.set_word("dacMin", min); // FIXME not present, should come from configuration - req.set_word("dacMax", max); // FIXME not present, should come from configuration - req.set_word("dacStep", step); // FIXME not present, should come from configuration - - try { - rsp = rpc.call_method(req); - } STANDARD_CATCH; - checkRPCResponse("HwOptoHybrid::broadcastWrite"); - uint32_t size = rsp.get_word_array_size("data"); - std::vector data; - data.resize(size); - // results.resize(NVFATS*(max-min+1)/step); // FIXME should be the same as above, throw error if not? - // need to transform to std::vector<(NVFATS), std::vector<((max-min)/step)uint32_t> > - rsp.get_word_array("data", data.data()); - std::vector > results; - results.resize(24); - size_t idx = 0; - for (size_t vfat = 0; vfat < 24; ++vfat) { - auto vres = results.at(vfat); - for (size_t dac = 0; dac <= max-min; ++dac) { - vres.push_back(data.at(idx)); - ++idx; - } - } - return results; - } GEM_CATCH_RPC_ERROR("HwOptoHybrid::getUltraScanResults", gem::hw::devices::exception::Exception); -} - - //////// Firmware forced TTC commands \\\\\\\\* void gem::hw::optohybrid::HwOptoHybrid::sendL1A(uint32_t const& ntrigs, uint32_t const& rate) { - writeReg(getDeviceBaseNode(), "FPGA.GBT.FORCE_L1A",0x1); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.GBT.FORCE_L1A",0x1); } void gem::hw::optohybrid::HwOptoHybrid::sendResync(uint32_t const& nresync, uint32_t const& rate) { - writeReg(getDeviceBaseNode(), "FPGA.GBT.FORCE_RESYNC",0x1); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.GBT.FORCE_RESYNC",0x1); } void gem::hw::optohybrid::HwOptoHybrid::sendBC0(uint32_t const& nbc0, uint32_t const& rate) { - writeReg(getDeviceBaseNode(), "FPGA.GBT.FORCE_BC0",0x1); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.GBT.FORCE_BC0",0x1); } void gem::hw::optohybrid::HwOptoHybrid::sendBXN(uint32_t const& nbc0, uint32_t const& rate) { - writeReg(getDeviceBaseNode(), "FPGA.GBT.FORCE_BXN",0x1); + writeReg("GEM_AMC.OH.OH"+std::to_string(m_link)+".FPGA.GBT.FORCE_BXN",0x1); } //////// Counters \\\\\\\\* @@ -717,11 +491,11 @@ uint32_t gem::hw::optohybrid::HwOptoHybrid::getTTCCount(uint8_t const& signal, u switch(mode) { case(OptoHybridTTCMode::LOCAL_TTC): - return readReg(getDeviceBaseNode(),toolbox::toString("COUNTERS.TTC.GTX_TTC.%s", (ttcSignal.str()).c_str())); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("COUNTERS.TTC.GTX_TTC.%s", (ttcSignal.str()).c_str())); case(OptoHybridTTCMode::RESET): return 0x0; default: - return readReg(getDeviceBaseNode(),toolbox::toString("COUNTERS.TTC.SENT.%s", (ttcSignal.str()).c_str())); + return readReg("GEM_AMC.OH.OH"+std::to_string(m_link)+"."+toolbox::toString("COUNTERS.TTC.SENT.%s", (ttcSignal.str()).c_str())); } } diff --git a/gemhardware/managers/Makefile b/gemhardware/managers/Makefile index efd1b852..8e60b23b 100644 --- a/gemhardware/managers/Makefile +++ b/gemhardware/managers/Makefile @@ -12,6 +12,10 @@ ifndef PROJECT_NAME PROJECT_NAME=cmsgemos endif +ifndef GEM_VARIANT +GEM_VARIANT = ge11 +endif + Project=$(PROJECT_NAME) ShortProject=gem Package=gemhardware/managers @@ -28,13 +32,13 @@ GEMHWMANAGERS_VER_PATCH=1 include $(CfgDir)/mfDefsGEM.mk +UserCFlags+=-DGEM_VARIANT="$(GEM_VARIANT)" + Sources =version.cc # Sources+=utils/GEMCrateUtils.cc Sources+=amc13/AMC13Manager.cc amc13/AMC13ManagerWeb.cc amc13/AMC13Readout.cc -Sources+=amc/AMCManager.cc amc/AMCManagerWeb.cc amc/AMCMonitor.cc -# Sources+=glib/GLIBManager.cc glib/GLIBManagerWeb.cc glib/GLIBMonitor.cc -# Sources+=ctp7/CTP7Manager.cc ctp7/CTP7ManagerWeb.cc ctp7/CTP7Monitor.cc -Sources+=optohybrid/OptoHybridManager.cc optohybrid/OptoHybridManagerWeb.cc optohybrid/OptoHybridMonitor.cc +Sources+=amc/AMCManager.cc amc/AMCManagerWeb.cc +Sources+=optohybrid/OptoHybridManager.cc optohybrid/OptoHybridManagerWeb.cc #Sources+=GEMController.cc GEMControllerPanelWeb.cc DynamicLibrary=gemhwmanagers @@ -47,6 +51,7 @@ IncludeDirs+=$(BUILD_HOME)/gembase/include IncludeDirs+=$(BUILD_HOME)/gemreadout/include IncludeDirs+=$(uHALROOT)/include IncludeDirs+=$(XHAL_ROOT)/include +IncludeDirs+=$(CTP7_ROOT)/include DependentLibraryDirs+=$(BUILD_HOME)/$(Package)/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) DependentLibraryDirs+=$(BUILD_HOME)/gemhardware/devices/lib/$(XDAQ_OS)/$(XDAQ_PLATFORM) diff --git a/gemhardware/managers/include/gem/hw/managers/amc/AMCManager.h b/gemhardware/managers/include/gem/hw/managers/amc/AMCManager.h index c97f257e..4fb025c2 100644 --- a/gemhardware/managers/include/gem/hw/managers/amc/AMCManager.h +++ b/gemhardware/managers/include/gem/hw/managers/amc/AMCManager.h @@ -6,28 +6,23 @@ #include #include "gem/base/GEMFSMApplication.h" -// #include "gem/hw/amc/AMCSettings.h" #include "gem/utils/soap/GEMSOAPToolBox.h" namespace gem { namespace hw { - namespace glib { - class HwGLIB; - } namespace amc { class AMCManagerWeb; - class AMCMonitor; + class HwGenericAMC; - using amc_shared_ptr = std::shared_ptr; + using amc_shared_ptr = std::shared_ptr; using is_toolbox_ptr = std::shared_ptr; class AMCManager : public gem::base::GEMFSMApplication { friend class AMCManagerWeb; - // friend class AMCMonitor; public: XDAQ_INSTANTIATOR(); @@ -102,7 +97,6 @@ namespace gem { mutable gem::utils::Lock m_deviceLock; ///< [MAX_AMCS_PER_CRATE]; std::array m_amcs; ///< HwGLIB pointers to be managed - std::array, MAX_AMCS_PER_CRATE> m_amcMonitors; ///< AMCMonito pointers to be managed std::array is_amcs; ///< AMC InfoSpace pointers to be managed xdata::Vector > m_amcInfo; ///< [MAX_AMCS_PER_CRATE]; diff --git a/gemhardware/managers/include/gem/hw/managers/amc/AMCManagerWeb.h b/gemhardware/managers/include/gem/hw/managers/amc/AMCManagerWeb.h index a73d35ac..858bfcb1 100644 --- a/gemhardware/managers/include/gem/hw/managers/amc/AMCManagerWeb.h +++ b/gemhardware/managers/include/gem/hw/managers/amc/AMCManagerWeb.h @@ -13,7 +13,6 @@ namespace gem { class AMCManagerWeb : public gem::base::GEMWebApplication { - //friend class AMCMonitor; friend class AMCManager; public: diff --git a/gemhardware/managers/include/gem/hw/managers/amc/AMCMonitor.h b/gemhardware/managers/include/gem/hw/managers/amc/AMCMonitor.h deleted file mode 100644 index 20bfa021..00000000 --- a/gemhardware/managers/include/gem/hw/managers/amc/AMCMonitor.h +++ /dev/null @@ -1,68 +0,0 @@ -/** @file AMCMonitor.h */ - -#ifndef GEM_HW_AMC_AMCMONITOR_H -#define GEM_HW_AMC_AMCMONITOR_H - -#include "gem/base/GEMMonitor.h" -#include "gem/hw/devices/exception/Exception.h" -#include "gem/hw/devices/glib/HwGLIB.h" - -namespace gem { - namespace hw { - namespace glib { - class HwGLIB; - } - - namespace amc { - - class AMCManager; - - class AMCMonitor : public gem::base::GEMMonitor - { - public: - - /** - * Constructor from GEMFSMApplication derived classes - * @param amc the HwGLIB uhal device which is to be monitored - * @param amcManager the manager application for the AMC to be monitored - */ - AMCMonitor(std::shared_ptr amc, AMCManager* amcManager, int const& index); - - virtual ~AMCMonitor(); - - virtual void updateMonitorables(); - virtual void reset(); - void setupHwMonitoring(); - void buildMonitorPage(xgi::Output* out); - void buildDAQStatusTable(xgi::Output* out); - void buildTriggerStatusTable(xgi::Output* out); - std::string getDeviceID() { return p_amc->getDeviceID(); } - - private: - std::shared_ptr p_amc; - - // system_monitorables - // "BOARD_ID" - // "SYSTEM_ID" - // "FIRMWARE_ID" - // "FIRMWARE_DATE" - // "IP_ADDRESS" - // "MAC_ADDRESS" - // "SFP1_STATUS" - // "SFP2_STATUS" - // "SFP3_STATUS" - // "SFP4_STATUS" - // "FMC1_STATUS" - // "FMC2_STATUS" - // "FPGA_RESET" - // "GBE_INT" - // "V6_CPLD" - // "CPLD_LOCK" - - }; // class AMCMonitor - - } // namespace gem::hw::amc - } // namespace gem::hw -} // namespace gem - -#endif // GEM_HW_AMC_AMCMONITOR_H diff --git a/gemhardware/managers/include/gem/hw/managers/amc13/AMC13Manager.h b/gemhardware/managers/include/gem/hw/managers/amc13/AMC13Manager.h index 30227592..bb24aabb 100644 --- a/gemhardware/managers/include/gem/hw/managers/amc13/AMC13Manager.h +++ b/gemhardware/managers/include/gem/hw/managers/amc13/AMC13Manager.h @@ -10,7 +10,6 @@ #include "gem/base/GEMFSMApplication.h" #include "gem/hw/devices/exception/Exception.h" -//#include "gem/hw/amc13/AMC13Monitoring.hh" #include "toolbox/task/TimerFactory.h" #include "toolbox/task/TimerListener.h" diff --git a/gemhardware/managers/include/gem/hw/managers/amc13/AMC13ManagerWeb.h b/gemhardware/managers/include/gem/hw/managers/amc13/AMC13ManagerWeb.h index bf3960c3..77a08560 100644 --- a/gemhardware/managers/include/gem/hw/managers/amc13/AMC13ManagerWeb.h +++ b/gemhardware/managers/include/gem/hw/managers/amc13/AMC13ManagerWeb.h @@ -6,7 +6,6 @@ #include #include "gem/base/GEMWebApplication.h" -//#include "gem/hw/amc13/AMC13Manager.h" namespace gem { namespace hw { @@ -16,7 +15,6 @@ namespace gem { class AMC13ManagerWeb : public gem::base::GEMWebApplication { - //friend class AMC13Monitor; friend class AMC13Manager; public: diff --git a/gemhardware/managers/include/gem/hw/managers/exception/Exception.h b/gemhardware/managers/include/gem/hw/managers/exception/Exception.h index ddb116d9..a37689eb 100644 --- a/gemhardware/managers/include/gem/hw/managers/exception/Exception.h +++ b/gemhardware/managers/include/gem/hw/managers/exception/Exception.h @@ -36,12 +36,7 @@ GEM_HW_MANAGERS_DEFINE_ALARM(MonitoringFailureAlarm) // FIXME: SHOULD I BE A MACRO OR A FUNCTION ELSEWHERE // FIXME: SHOULD TRANSITION ERRORS FORCE FSM TO ERROR? #define GEM_HW_TRANSITION_CATCH(MSG_BASE, EX_TYPE) \ -catch (uhalException const& e) { \ - std::stringstream errmsg; \ - errmsg << MSG_BASE << " caught uHAL exception " << e.what(); \ - CMSGEMOS_ERROR(errmsg.str()); \ - XCEPT_RAISE(EX_TYPE, errmsg.str()); \ -} catch (EX_TYPE const& e) { \ +catch (EX_TYPE const& e) { \ std::stringstream errmsg; \ errmsg << MSG_BASE << " caught exception " << e.what(); \ CMSGEMOS_ERROR(errmsg.str()); \ diff --git a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManager.h b/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManager.h index d87a54da..49454478 100644 --- a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManager.h +++ b/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManager.h @@ -17,7 +17,6 @@ namespace gem { class HwOptoHybrid; class OptoHybridManagerWeb; - class OptoHybridMonitor; using optohybrid_shared_ptr = std::shared_ptr; using is_toolbox_ptr = std::shared_ptr; @@ -96,9 +95,6 @@ namespace gem { HWMapMatrix m_optohybrids; ///< HwOptoHybrid pointers to be managed - HWMapMatrix, MAX_OPTOHYBRIDS_PER_AMC, MAX_AMCS_PER_CRATE> - m_optohybridMonitors; ///< OptoHybridMonitor pointers to be managed - HWMapMatrix is_optohybrids; ///< OptoHybrid InfoSpace pointers to be managed diff --git a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManagerWeb.h b/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManagerWeb.h index 3ae37ea7..e16d7c48 100644 --- a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManagerWeb.h +++ b/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridManagerWeb.h @@ -13,9 +13,6 @@ namespace gem { class OptoHybridManagerWeb : public gem::base::GEMWebApplication { - //friend class OptoHybridMonitor; - //friend class OptoHybridManager; - public: OptoHybridManagerWeb(OptoHybridManager *optohybridApp); diff --git a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridMonitor.h b/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridMonitor.h deleted file mode 100644 index 0855703e..00000000 --- a/gemhardware/managers/include/gem/hw/managers/optohybrid/OptoHybridMonitor.h +++ /dev/null @@ -1,58 +0,0 @@ -/** @file OptoHybridMonitor.h */ - -#ifndef GEM_HW_OPTOHYBRID_OPTOHYBRIDMONITOR_H -#define GEM_HW_OPTOHYBRID_OPTOHYBRIDMONITOR_H - -#include "gem/base/GEMMonitor.h" - -namespace gem { - namespace hw { - namespace optohybrid { - - class HwOptoHybrid; - class OptoHybridManager; - - class OptoHybridMonitor : public gem::base::GEMMonitor - { - public: - - /** - * Constructor from GEMFSMApplication derived classes - * @param optohybrid the HwOptoHybrid uhal device which is to be monitored - * @param optohybridManager the manager application for the OptoHybrid to be monitored - */ - OptoHybridMonitor(std::shared_ptr optohybrid, OptoHybridManager* optohybridManager, int const& index); - - virtual ~OptoHybridMonitor(); - - virtual void updateMonitorables(); - virtual void reset(); - void setupHwMonitoring(); - - /** - * @brief display the monitor items - */ - void buildMonitorPage(xgi::Output* out); - - /** - * @brief special layout for monitor items in 'TTC Counters' monitor set - */ - void buildTTCCounterTable(xgi::Output* out); - - /** - * @brief special layout for monitor items in 'Other Counters' monitor set - */ - void buildOtherCounterTable(xgi::Output* out); - - std::string getDeviceID(); - - private: - std::shared_ptr p_optohybrid; - - }; // class OptoHybridMonitor - - } // namespace gem::hw::optohybrid - } // namespace gem::hw -} // namespace gem - -#endif // GEM_HW_OptoHybrid_OptoHybridMONITOR_H diff --git a/gemhardware/managers/src/common/amc/AMCManager.cc b/gemhardware/managers/src/common/amc/AMCManager.cc index 1a164f50..15fcc076 100644 --- a/gemhardware/managers/src/common/amc/AMCManager.cc +++ b/gemhardware/managers/src/common/amc/AMCManager.cc @@ -6,11 +6,10 @@ * date: */ -#include "gem/hw/devices/glib/HwGLIB.h" +#include "gem/hw/devices/amc/HwGenericAMC.h" #include "gem/hw/managers/amc/AMCManager.h" -#include "gem/hw/managers/amc/AMCMonitor.h" #include "gem/hw/managers/amc/AMCManagerWeb.h" #include "gem/hw/managers/exception/Exception.h" @@ -80,7 +79,6 @@ gem::hw::amc::AMCManager::AMCManager(xdaq::ApplicationStub* stub) : // initialize the AMC application objects CMSGEMOS_DEBUG("AMCManager::Connecting to the AMCManagerWeb interface"); p_gemWebInterface = new gem::hw::amc::AMCManagerWeb(this); - // p_gemMonitor = new gem::hw::amc::AMCHwMonitor(this); CMSGEMOS_DEBUG("AMCManager::done"); // set up the info hwCfgInfoSpace @@ -113,7 +111,6 @@ void gem::hw::amc::AMCManager::actionPerformed(xdata::Event& event) CMSGEMOS_DEBUG("AMCManager::Found attribute:" << slot.bag.toString()); } } - // p_gemMonitor->startMonitoring(); } // FIXME update monitoring variables? @@ -129,33 +126,11 @@ void gem::hw::amc::AMCManager::init() void gem::hw::amc::AMCManager::initializeAction() { CMSGEMOS_DEBUG("AMCManager::initializeAction begin"); + // // FIXME make me more streamlined - for (unsigned slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - CMSGEMOS_DEBUG("AMCManager::looping over slots(" << (slot+1) << ") and finding expected cards"); - AMCInfo& info = m_amcInfo[slot].bag; - if ((m_amcEnableMask >> (slot)) & 0x1) { - CMSGEMOS_DEBUG("AMCManager::info:" << info.toString()); - CMSGEMOS_DEBUG("AMCManager::expect a card in slot " << (slot+1)); - CMSGEMOS_DEBUG("AMCManager::bag: " - << "crate " << info.crateID.value_ - << " slot " << info.slotID.value_); - // this maybe shouldn't be done? - info.slotID = slot+1; - CMSGEMOS_DEBUG("AMCManager::bag: " - << "crate " << info.crateID.value_ - << " slot " << info.slotID.value_); - // this maybe shouldn't be done? - info.present = true; - // actually check presence? this just says that we expect it to be there - // check if there is a AMC in the specified slot, if not, do not initialize - // set the web view to be empty or grey - // if (!info.present.value_) continue; - // needs .value_? - // p_gemWebInterface->amcInSlot(slot); - } - } - - // FIXME make me more streamlined + // this maybe shouldn't be done? Commenting out for now, but needs testing + //info.slotID = slot+1; + //info.present = true; for (auto const& infoi : m_amcInfo) { auto&& info = infoi.bag; @@ -186,76 +161,17 @@ void gem::hw::amc::AMCManager::initializeAction() try { CMSGEMOS_DEBUG("AMCManager::obtaining pointer to HwGLIB"); - m_amcs.at(slot) = amc_shared_ptr(new gem::hw::glib::HwGLIB(deviceName, m_connectionFile.toString())); + m_amcs.at(slot) = amc_shared_ptr(new gem::hw::amc::HwGenericAMC(deviceName)); amc_shared_ptr amc = m_amcs.at(slot); - if (amc->isHwConnected()) { - CMSGEMOS_DEBUG("AMCManager::Creating InfoSpace items for AMC device " << deviceName); - - // FIXME should not need this here? - amc->disableDAQLink(); - - // maybe better to raise exception here and fail if not connected, as we expected the card to be here? - createAMCInfoSpaceItems(is_amcs.at(slot), amc); - - if (!m_disableMonitoring) { - m_amcMonitors.at(slot) = std::shared_ptr(new AMCMonitor(amc, this, slot+1)); - m_amcMonitors.at(slot)->addInfoSpace("HWMonitoring", is_amcs.at(slot)); - m_amcMonitors.at(slot)->setupHwMonitoring(); - m_amcMonitors.at(slot)->startMonitoring(); - } - } else { - std::stringstream msg; - msg << "AMCManager::initializeAction unable to communicate with AMC in slot " << slot; - CMSGEMOS_ERROR(msg.str()); - XCEPT_RAISE(gem::hw::devices::exception::Exception, "initializeAction failed"); - } + // maybe better to raise exception here and fail if not connected, as we expected the card to be here? + //FIXME what's the purpose of this + createAMCInfoSpaceItems(is_amcs.at(slot), amc); } GEM_HW_TRANSITION_CATCH("AMCManager::initializeAction",gem::hw::devices::exception::Exception); - // catch (uhalException const& e) { - // std::stringstream msg; - // msg << "AMCManager::initializeAction caught uHAL exception " << e.what(); - // CMSGEMOS_ERROR(msg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); - // } catch (gem::hw::devices::exception::Exception const& e) { - // std::stringstream msg; - // msg << "AMCManager::initializeAction caught exception " << e.what(); - // CMSGEMOS_ERROR(msg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); - // } catch (toolbox::net::exception::MalformedURN const& e) { - // std::stringstream msg; - // msg << "AMCManager::initializeAction caught exception " << e.what(); - // CMSGEMOS_ERROR(msg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); - // } catch (std::exception const& e) { - // std::stringstream msg; - // msg << "AMCManager::initializeAction caught exception " << e.what(); - // CMSGEMOS_ERROR(msg.str()); - // XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); - // } CMSGEMOS_DEBUG("AMCManager::connected"); // set the web view to be empty or grey // if (!info.present.value_) continue; // p_gemWebInterface->amcInSlot(slot); } - - // FIXME make me more streamlined - for (unsigned slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - AMCInfo& info = m_amcInfo[slot].bag; - - if (!info.present) - continue; - - amc_shared_ptr amc = m_amcs.at(slot); - if (amc->isHwConnected()) { - CMSGEMOS_DEBUG("AMCManager::connected a card in slot " << (slot+1)); - } else { - std::stringstream msg; - msg << "AMCManager::initializeAction AMC in slot " << (slot+1) << " is not connected"; - CMSGEMOS_ERROR(msg.str()); - // fireEvent("Fail"); - XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); - } - } - // usleep(10); // just for testing the timing of different applications CMSGEMOS_INFO("AMCManager::initializeAction end"); } @@ -265,7 +181,6 @@ void gem::hw::amc::AMCManager::configureAction() // FIXME make me more streamlined for (unsigned slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - // usleep(10); // just for testing the timing of different applications AMCInfo& info = m_amcInfo[slot].bag; if (!info.present) @@ -273,45 +188,21 @@ void gem::hw::amc::AMCManager::configureAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); - bool enableZS = info.enableZS.value_; bool doPhaseShift = m_doPhaseShift.value_; uint32_t runType = 0x0; try { // FIXME if we fail, do we go to error? + //FIXME review configureDAQModule, set it up correctly w.r.t. scan types amc->configureDAQModule(enableZS, doPhaseShift, runType, 0xfaac, m_relockPhase.value_, m_bc0LockPhaseShift.value_); } GEM_CATCH_RPC_ERROR("AMCManager::configureAction", gem::hw::devices::exception::ConfigurationProblem); - if (m_scanType.value_ == 2) { - CMSGEMOS_INFO("AMCManager::configureAction: FIRST " << m_scanMin.value_); - - amc->setDAQLinkRunType(0x2); - amc->setDAQLinkRunParameter(0x1,m_scanMin.value_); - // amc->setDAQLinkRunParameter(0x2,VT1); // set these at start so DQM has them? - // amc->setDAQLinkRunParameter(0x3,VT2); // set these at start so DQM has them? - } else if (m_scanType.value_ == 3) { - uint32_t initialVT1 = m_scanMin.value_; - uint32_t initialVT2 = 0; // std::max(0,(uint32_t)m_scanMax.value_); - CMSGEMOS_INFO("AMCManager::configureAction FIRST VT1 " << initialVT1 << " VT2 " << initialVT2); - - amc->setDAQLinkRunType(0x3); - // amc->setDAQLinkRunParameter(0x1,latency); // set this at start so DQM has it? - amc->setDAQLinkRunParameter(0x2,initialVT1); - amc->setDAQLinkRunParameter(0x3,initialVT2); - } else { - amc->setDAQLinkRunType(0x1); // FIXME duplicated in configureDAQModule call - amc->setDAQLinkRunParameters(0xfaac); // FIXME duplicated in configureDAQModule call - } - + // FIXME everyting considering the scanning should be set by the gemcalibration module // what else is required for configuring the AMC? // need to reset optical links? // reset counters? // setup run mode? // setup DAQ mode? - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->resumeMonitoring(); } else { std::stringstream msg; msg << "AMCManager::configureAction AMC in slot " << (slot+1) << " is not connected"; @@ -326,21 +217,10 @@ void gem::hw::amc::AMCManager::configureAction() void gem::hw::amc::AMCManager::startAction() { - if (m_scanType.value_ == 2) { - CMSGEMOS_INFO("AMCManager::startAction() " << std::endl << m_scanInfo.bag.toString()); - m_lastLatency = m_scanMin.value_; - m_lastVT1 = 0; - } else if (m_scanType.value_ == 3) { - CMSGEMOS_INFO("AMCManager::startAction() " << std::endl << m_scanInfo.bag.toString()); - m_lastLatency = 0; - m_lastVT1 = m_scanMin.value_; - } - CMSGEMOS_INFO("AMCManager::startAction begin"); // what is required for starting the AMC? // FIXME make me more streamlined for (unsigned slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - // usleep(10); CMSGEMOS_DEBUG("AMCManager::looping over slots(" << (slot+1) << ") and finding infospace items"); AMCInfo& info = m_amcInfo[slot].bag; @@ -349,22 +229,18 @@ void gem::hw::amc::AMCManager::startAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); CMSGEMOS_DEBUG("connected a card in slot " << (slot+1)); // enable the DAQ // amc->enableDAQModule(info.enableZS.value_); + //FIXME shall be one RPC call? amc->ttcModuleReset(); amc->enableDAQLink(0x4); // FIXME amc->resetDAQLink(); amc->setZS(info.enableZS.value_); amc->setL1AEnable(true); - usleep(10); // just for testing the timing of different applications - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->resumeMonitoring(); } else { std::stringstream msg; msg << "AMCManager::startAction AMC in slot " << (slot+1) << " is not connected"; @@ -372,14 +248,7 @@ void gem::hw::amc::AMCManager::startAction() // fireEvent("Fail"); XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); } - - /* - // reset the hw monitor, this was in release-v2 but not in integrated-application-framework, may have forgotten something - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->reset(); - */ } - // usleep(10); CMSGEMOS_INFO("AMCManager::startAction end"); } @@ -397,44 +266,10 @@ void gem::hw::amc::AMCManager::pauseAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); + //FIXME what should be done here? Disable triggers? wait for AMC to stop building events? CMSGEMOS_DEBUG("connected a card in slot " << (slot+1)); - if (m_scanType.value_ == 2) { - uint8_t updatedLatency = m_lastLatency + m_stepSize.value_; - CMSGEMOS_INFO("AMCManager::pauseAction LatencyScan AMC" << (slot+1) << " Latency " << (int)updatedLatency); - - // wait for events to finish building - while (!amc->l1aFIFOIsEmpty()) { - CMSGEMOS_DEBUG("AMCManager::pauseAction waiting for AMC" << (slot+1) << " to finish building events"); - usleep(10); - } - CMSGEMOS_DEBUG("AMCManager::pauseAction AMC" << (slot+1) << " finished building events, updating run parameter " - << (int)updatedLatency); - amc->setDAQLinkRunParameter(0x1,updatedLatency); - } else if (m_scanType.value_ == 3) { - uint8_t updatedVT1 = m_lastVT1 + m_stepSize.value_; - uint8_t updatedVT2 = 0; //std::max(0,(int)m_scanMax.value_); - CMSGEMOS_INFO("AMCManager::pauseAction ThresholdScan AMC" << (slot+1) << "" - << " VT1 " << (int)updatedVT1 - << " VT2 " << (int)updatedVT2); - - // wait for events to finish building - while (!amc->l1aFIFOIsEmpty()) { - CMSGEMOS_DEBUG("AMCManager::pauseAction waiting for AMC" << (slot+1) << " to finish building events"); - usleep(10); - } - CMSGEMOS_DEBUG("AMCManager::pauseAction finished AMC" << (slot+1) << " building events, updating VT1 " << (int)updatedVT1 - << " and VT2 " << (int)updatedVT2); - amc->setDAQLinkRunParameter(0x2,updatedVT1); - amc->setDAQLinkRunParameter(0x3,updatedVT2); - } - // usleep(100); // just for testing the timing of different applications - - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->resumeMonitoring(); } else { std::stringstream msg; msg << "AMCManager::pauseAction AMC in slot " << (slot+1) << " is not connected"; @@ -443,24 +278,12 @@ void gem::hw::amc::AMCManager::pauseAction() XCEPT_RAISE(gem::hw::devices::exception::Exception, msg.str()); } } - - // Update the scan parameters - if (m_scanType.value_ == 2) { - CMSGEMOS_INFO("AMCManager::pauseAction LatencyScan old Latency " << (int)m_lastLatency); - m_lastLatency += m_stepSize.value_; - CMSGEMOS_INFO("AMCManager::pauseAction LatencyScan new Latency " << (int)m_lastLatency); - } else if (m_scanType.value_ == 3) { - CMSGEMOS_INFO("AMCManager::pauseAction ThresholdScan old VT1 " << (int)m_lastVT1); - m_lastVT1 += m_stepSize.value_; - CMSGEMOS_INFO("AMCManager::pauseAction ThresholdScan new VT1 " << (int)m_lastVT1); - } CMSGEMOS_INFO("AMCManager::pauseAction end"); } void gem::hw::amc::AMCManager::resumeAction() { // what is required for resuming the AMC? - usleep(10); // just for testing the timing of different applications CMSGEMOS_INFO("AMCManager::resumeAction end"); } @@ -478,8 +301,6 @@ void gem::hw::amc::AMCManager::stopAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); // what is required for stopping the AMC? // FIXME temporarily inhibit triggers at the AMC @@ -487,11 +308,8 @@ void gem::hw::amc::AMCManager::stopAction() amc->disableDAQLink(); amc->resetDAQLink(); - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->resumeMonitoring(); } } - usleep(10); // just for testing the timing of different applications CMSGEMOS_INFO("AMCManager::stopAction end"); } @@ -509,16 +327,12 @@ void gem::hw::amc::AMCManager::haltAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); // what is required for halting the AMC? // FIXME temporarily inhibit triggers at the AMC amc->setL1AEnable(false); amc->writeReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK", 0x0); - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->resumeMonitoring(); } } CMSGEMOS_INFO("AMCManager::haltAction end"); @@ -541,17 +355,12 @@ void gem::hw::amc::AMCManager::resetAction() amc_shared_ptr amc = m_amcs.at(slot); if (amc->isHwConnected()) { - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->pauseMonitoring(); // what is required for resetting the AMC? // FIXME temporarily inhibit triggers at the AMC amc->setL1AEnable(false); - amc->writeReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK", 0x0); } // reset the hw monitor - if (m_amcMonitors.at(slot)) - m_amcMonitors.at(slot)->reset(); CMSGEMOS_DEBUG("AMCManager::looking for hwCfgInfoSpace items for AMC in slot " << (slot+1)); toolbox::net::URN hwCfgURN("urn:gem:hw:"+toolbox::toString("gem-shelf%02d-amc%02d", @@ -597,20 +406,6 @@ void gem::hw::amc::AMCManager::createAMCInfoSpaceItems(is_toolbox_ptr is_amc, am is_amc->createUInt32("AMC_FIRMWARE_VERSION", amc->getFirmwareVer(), NULL, GEMUpdateType::PROCESS, "docstring", "fwveramc"); is_amc->createUInt32("AMC_FIRMWARE_DATE", amc->getFirmwareDate(), NULL, GEMUpdateType::PROCESS, "docstring", "dateoh"); - // FIXME AMC ONLY? OBSOLETE? - is_amc->createUInt32("IP_ADDRESS", amc->getIPAddress(), NULL, GEMUpdateType::NOUPDATE, "docstring", "ip"); - is_amc->createUInt64("MAC_ADDRESS", amc->getMACAddress(), NULL, GEMUpdateType::NOUPDATE, "docstring", "mac"); - is_amc->createUInt32("SFP1_STATUS", amc->SFPStatus(1), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("SFP2_STATUS", amc->SFPStatus(2), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("SFP3_STATUS", amc->SFPStatus(3), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("SFP4_STATUS", amc->SFPStatus(4), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("FMC1_STATUS", amc->FMCPresence(0), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("FMC2_STATUS", amc->FMCPresence(1), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("FPGA_RESET", amc->FPGAResetStatus(), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("GBE_INT", amc->GbEInterrupt(), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("V6_CPLD", amc->V6CPLDStatus(), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("CPLD_LOCK", amc->CDCELockStatus(), NULL, GEMUpdateType::HW32); - is_amc->createUInt32("L1A" , amc->getTTCCounter(AMCTTCCommand::TTC_L1A), NULL, GEMUpdateType::HW32); is_amc->createUInt32("BC0" , amc->getTTCCounter(AMCTTCCommand::TTC_BC0), NULL, GEMUpdateType::HW32); is_amc->createUInt32("EC0" , amc->getTTCCounter(AMCTTCCommand::TTC_EC0), NULL, GEMUpdateType::HW32); diff --git a/gemhardware/managers/src/common/amc/AMCManagerWeb.cc b/gemhardware/managers/src/common/amc/AMCManagerWeb.cc index 6ae7e0cd..9a0843ee 100644 --- a/gemhardware/managers/src/common/amc/AMCManagerWeb.cc +++ b/gemhardware/managers/src/common/amc/AMCManagerWeb.cc @@ -6,7 +6,6 @@ #include "gem/hw/managers/amc/AMCManager.h" #include "gem/hw/managers/amc/AMCManagerWeb.h" -#include "gem/hw/managers/amc/AMCMonitor.h" #include "gem/hw/devices/exception/Exception.h" @@ -32,22 +31,6 @@ void gem::hw::amc::AMCManagerWeb::webDefault(xgi::Input* in, xgi::Output* out) GEMWebApplication::webDefault(in, out); } -/*To be filled in with the monitor page code*/ -void gem::hw::amc::AMCManagerWeb::monitorPage(xgi::Input* in, xgi::Output* out) -{ - CMSGEMOS_DEBUG("AMCManagerWeb::monitorPage"); - - *out << "
" << std::endl; - *out << "
" << std::endl; - // all monitored AMCs in one page, or separate tabs? - /* let's have a summary of major parameters for all managed AMCs on this page, - then have the card tab have the full information for every AMC - */ - buildCardSummaryTable(in, out); - *out << "
" << std::endl; - *out << "
" << std::endl; -} - /*To be filled in with the expert page code*/ void gem::hw::amc::AMCManagerWeb::expertPage(xgi::Input* in, xgi::Output* out) { @@ -69,63 +52,6 @@ void gem::hw::amc::AMCManagerWeb::applicationPage(xgi::Input* in, xgi::Output* o *out << " " << std::endl; } -/*To be filled in with the card page code*/ -void gem::hw::amc::AMCManagerWeb::buildCardSummaryTable(xgi::Input* in, xgi::Output* out) -{ - *out << " " << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register" << cgicc::th() << std::endl; - // loop over all managed AMCs and put AMCXX as the header - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - auto card = dynamic_cast(p_gemFSMApp)->m_amcMonitors.at(i); - if (card) { - *out << cgicc::th() << card->getDeviceID() << cgicc::th() << std::endl; - } - } - *out << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << " " << std::endl; - - // loop over values to be monitored - // L1A, CalPulse, Resync, BC0, Link Errors, Link FIFO status, Event builder status - *out << " " << std::endl - << " " << std::endl; - - // loop over AMCs to be monitored - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - auto card = dynamic_cast(p_gemFSMApp)->m_amcMonitors.at(i); - if (card) { - *out << " " << std::endl; - } - } - *out << " " << std::endl; - - // close off the table - *out << " " << std::endl - << "
" << std::endl - //<< registerName << std::endl - << " getDeviceID() << "\">" << std::endl - << "
" << std::endl; -} - -/*To be filled in with the card page code*/ -void gem::hw::amc::AMCManagerWeb::cardPage(xgi::Input* in, xgi::Output* out) -{ - CMSGEMOS_DEBUG("AMCManagerWeb::cardPage"); - // fill this page with the card views for the AMCManager - *out << "
" << std::endl; - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - auto card = dynamic_cast(p_gemFSMApp)->m_amcMonitors.at(i); - if (card) { - *out << "
getDeviceID() << "\" >" << std::endl; - card->buildMonitorPage(out); - *out << "
" << std::endl; - } - } - *out << "
" << std::endl; -} - /*To be filled in with the card page code*/ void gem::hw::amc::AMCManagerWeb::registerDumpPage(xgi::Input* in, xgi::Output* out) { @@ -133,22 +59,12 @@ void gem::hw::amc::AMCManagerWeb::registerDumpPage(xgi::Input* in, xgi::Output* // dump registers for a given AMC and display } +void gem::hw::amc::AMCManagerWeb::monitorPage(xgi::Input* in, xgi::Output* out) +{ + CMSGEMOS_DEBUG("AMCManagerWeb::monitorPage"); +} + void gem::hw::amc::AMCManagerWeb::jsonUpdate(xgi::Input* in, xgi::Output* out) { CMSGEMOS_DEBUG("AMCManagerWeb::jsonUpdate"); - out->getHTTPResponseHeader().addHeader("Content-Type", "application/json"); - *out << " { " << std::endl; - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - *out << "\"amc" << std::setw(2) << std::setfill('0') << (i+1) << "\" : { " << std::endl; - auto card = dynamic_cast(p_gemFSMApp)->m_amcMonitors.at(i); - if (card) { - card->jsonUpdateItemSets(out); - } - // can't have a trailing comma for the last entry... - if (i == (gem::base::GEMApplication::MAX_AMCS_PER_CRATE-1)) - *out << " }" << std::endl; - else - *out << " }," << std::endl; - } - *out << " } " << std::endl; } diff --git a/gemhardware/managers/src/common/amc/AMCMonitor.cc b/gemhardware/managers/src/common/amc/AMCMonitor.cc deleted file mode 100644 index a7ceeea5..00000000 --- a/gemhardware/managers/src/common/amc/AMCMonitor.cc +++ /dev/null @@ -1,760 +0,0 @@ -/** - * class: AMCMonitor - * description: Monitor application for AMC cards - * structure borrowed from TCDS core, with nods to HCAL and EMU code - * author: J. Sturdy - * date: - */ - -#include "gem/hw/devices/glib/HwGLIB.h" - -#include "gem/hw/managers/amc/AMCMonitor.h" -#include "gem/hw/managers/amc/AMCManager.h" -#include "gem/base/GEMApplication.h" -#include "gem/base/GEMFSMApplication.h" - -typedef gem::base::utils::GEMInfoSpaceToolBox::UpdateType GEMUpdateType; - -gem::hw::amc::AMCMonitor::AMCMonitor(std::shared_ptr amc, AMCManager* amcManager, int const& index) : - GEMMonitor(amcManager->getApplicationLogger(), static_cast(amcManager), index), - p_amc(amc) -{ - // application info space is added in the base class constructor - // addInfoSpace("Application", amcManager->getApplicationInfoSpace()); - // addInfoSpace("AMC", p_amc->getHwInfoSpace()); - - // if (!p_amc->getHwInfoSpace()->hasItem(monname)) - // p_amc->getHwInfoSpace()->fireItemAvailable(monname, &monvar); - - updateMonitorables(); -} - - -void gem::hw::amc::AMCMonitor::setupHwMonitoring() -{ - // create the values to be monitored in the info space - addMonitorableSet("SYSTEM", "HWMonitoring"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("BOARD_ID", "AMC_SYSTEM.SYSTEM.BOARD_ID"), - GEMUpdateType::NOUPDATE, "id"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("SYSTEM_ID", "AMC_SYSTEM.SYSTEM.SYSTEM_ID"), - GEMUpdateType::NOUPDATE, "id"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("FIRMWARE_VERSION", "AMC_SYSTEM.SYSTEM.FIRMWARE.ID"), - GEMUpdateType::NOUPDATE, "fwveramc"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("FIRMWARE_DATE", "AMC_SYSTEM.SYSTEM.FIRMWARE.DATE"), - GEMUpdateType::NOUPDATE, "dateamc"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("AMC_FIRMWARE_VERSION", "GEM_SYSTEM.RELEASE"), - GEMUpdateType::NOUPDATE, "fwveramc"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("AMC_FIRMWARE_DATE", "GEM_SYSTEM.RELEASE.DATE"), - GEMUpdateType::NOUPDATE, "dateoh"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("IP_ADDRESS", "AMC_SYSTEM.SYSTEM.IP_INFO"), - GEMUpdateType::NOUPDATE, "ip"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("MAC_ADDRESS", "AMC_SYSTEM.SYSTEM.MAC"), - GEMUpdateType::NOUPDATE, "mac"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("SFP1_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.SFP1.STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("SFP2_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.SFP2.STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("SFP3_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.SFP3.STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("SFP4_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.SFP4.STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("FMC1_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.FMC1_PRESENT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("FMC2_STATUS", "AMC_SYSTEM.SYSTEM.STATUS.FMC2_PRESENT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("FPGA_RESET", "AMC_SYSTEM.SYSTEM.STATUS.FPGA_RESET"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("GBE_INT", "AMC_SYSTEM.SYSTEM.STATUS.GBE_INT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("V6_CPLD", "AMC_SYSTEM.SYSTEM.STATUS.V6_CPLD"), - GEMUpdateType::HW32, "hex"); - addMonitorable("SYSTEM", "HWMonitoring", - std::make_pair("CPLD_LOCK", "AMC_SYSTEM.SYSTEM.STATUS.CDCE_LOCK"), - GEMUpdateType::HW32, "hex"); - - addMonitorableSet("COUNTERS", "HWMonitoring"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("L1A", "TTC.CMD_COUNTERS.L1A"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("BC0", "TTC.CMD_COUNTERS.BC0"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("EC0", "TTC.CMD_COUNTERS.EC0"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("RESYNC", "TTC.CMD_COUNTERS.RESYNC"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("OC0", "TTC.CMD_COUNTERS.OC0"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("HARD_RESET", "TTC.CMD_COUNTERS.HARD_RESET"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("CalPulse", "TTC.CMD_COUNTERS.CALPULSE"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("START", "TTC.CMD_COUNTERS.START"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("STOP", "TTC.CMD_COUNTERS.STOP"), - GEMUpdateType::HW32, "dec"); - addMonitorable("COUNTERS", "HWMonitoring", - std::make_pair("TEST_SYNC", "TTC.CMD_COUNTERS.TEST_SYNC"), - GEMUpdateType::HW32, "dec"); - - addMonitorableSet("DAQ Status", "HWMonitoring"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("CONTROL", "DAQ.CONTROL"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("STATUS", "DAQ.STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("NOTINTABLE_ERR", "DAQ.EXT_STATUS.NOTINTABLE_ERR"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DISPER_ERR", "DAQ.EXT_STATUS.DISPER_ERR"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("EVT_SENT", "DAQ.EXT_STATUS.EVT_SENT"), - GEMUpdateType::HW32, "dec"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("L1AID", "DAQ.EXT_STATUS.L1AID"), - GEMUpdateType::HW32, "dec"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("MAX_DAV_TIMER", "DAQ.EXT_STATUS.MAX_DAV_TIMER"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("LAST_DAV_TIMER", "DAQ.EXT_STATUS.LAST_DAV_TIMER"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("L1A_FIFO_DATA_CNT", "DAQ.EXT_STATUS.L1A_FIFO_DATA_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DAQ_FIFO_DATA_CNT", "DAQ.EXT_STATUS.DAQ_FIFO_DATA_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("L1A_FIFO_NEAR_FULL_CNT", "DAQ.EXT_STATUS.L1A_FIFO_NEAR_FULL_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DAQ_FIFO_NEAR_FULL_CNT", "DAQ.EXT_STATUS.DAQ_FIFO_NEAR_FULL_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DAQ_ALMOST_FULL_CNT", "DAQ.EXT_STATUS.DAQ_ALMOST_FULL_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DAQ_ALMOST_FULL_CNT", "DAQ.EXT_STATUS.DAQ_ALMOST_FULL_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("TTS_WARN_CNT", "DAQ.EXT_STATUS.TTS_WARN_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("DAQ_WORD_RATE", "DAQ.EXT_STATUS.DAQ_WORD_RATE"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("RUN_TYPE", "DAQ.EXT_CONTROL.RUN_TYPE"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair("RUN_PARAMS", "DAQ.EXT_CONTROL.RUN_PARAMS"), - GEMUpdateType::HW32, "hex"); - - addMonitorableSet("TTC", "HWMonitoring"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("TTC_SPY", "TTC.TTC_SPY_BUFFER"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("MMCM_LOCKED", "TTC.STATUS.CLK.MMCM_LOCKED"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("BC0_LOCKED", "TTC.STATUS.BC0.LOCKED"), - GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PHASE_LOCKED", "TTC.STATUS.CLK.PHASE_LOCKED"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("SYNC_DONE", "TTC.STATUS.CLK.SYNC_DONE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("L1A_RATE", "TTC.L1A_RATE"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("MMCM_UNLOCK_CNT", "TTC.STATUS.CLK.MMCM_UNLOCK_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("BC0_UNLOCK_CNT", "TTC.STATUS.BC0.UNLOCK_CNT"), - GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PHASE_UNLOCK_CNT", "TTC.STATUS.CLK.PHASE_UNLOCK_CNT"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PHASE_UNLOCK_TIME", "TTC.STATUS.CLK.PHASE_UNLOCK_TIME"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("SYNC_DONE_TIME", "TTC.STATUS.CLK.SYNC_DONE_TIME"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("BC0_OVERFLOW_CNT", "TTC.STATUS.BC0.OVERFLOW_CNT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("BC0_UNDERFLOW_CNT", "TTC.STATUS.BC0.UNDERFLOW_CNT"), - GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PA_PLL_LOCK_WINDOW", "TTC.STATUS.CLK.PA_PLL_LOCK_WINDOW"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PA_PHASE_SHIFT_CNT", "TTC.STATUS.CLK.PA_PHASE_SHIFT_CNT"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PA_PLL_LOCK_CLOCKS", "TTC.STATUS.CLK.PA_PLL_LOCK_CLOCKS"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("PA_FSM_STATE", "TTC.STATUS.CLK.PA_FSM_STATE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE", "TTC.STATUS.CLK.TTC_PM_PHASE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_MEAN", "TTC.STATUS.CLK.TTC_PM_PHASE_MEAN"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_MAX", "TTC.STATUS.CLK.TTC_PM_PHASE_MAX"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_MIN", "TTC.STATUS.CLK.TTC_PM_PHASE_MIN"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_JUMP_CNT", "TTC.STATUS.CLK.TTC_PM_PHASE_JUMP_CNT"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_JUMP_SIZE", "TTC.STATUS.CLK.TTC_PM_PHASE_JUMP_SIZE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("TTC_PM_PHASE_JUMP_TIME", "TTC.STATUS.CLK.TTC_PM_PHASE_JUMP_TIME"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE", "TTC.STATUS.CLK.GTH_PM_PHASE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_MEAN", "TTC.STATUS.CLK.GTH_PM_PHASE_MEAN"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_MAX", "TTC.STATUS.CLK.GTH_PM_PHASE_MAX"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_MIN", "TTC.STATUS.CLK.GTH_PM_PHASE_MIN"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_JUMP_CNT", "TTC.STATUS.CLK.GTH_PM_PHASE_JUMP_CNT"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_JUMP_SIZE", "TTC.STATUS.CLK.GTH_PM_PHASE_JUMP_SIZE"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - // FIXME NOT YET PRESENT // addMonitorable("TTC", "HWMonitoring", - // FIXME NOT YET PRESENT // std::make_pair("GTH_PM_PHASE_JUMP_TIME", "TTC.STATUS.CLK.GTH_PM_PHASE_JUMP_TIME"), - // FIXME NOT YET PRESENT // GEMUpdateType::HW32, "hex"); - - addMonitorable("TTC", "HWMonitoring", - std::make_pair("BC0_CMD", "TTC.CONFIG.CMD_BC0"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("EC0_CMD", "TTC.CONFIG.CMD_EC0"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("RESYNC_CMD", "TTC.CONFIG.CMD_RESYNC"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("OC0_CMD", "TTC.CONFIG.CMD_OC0"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("HARD_RESET_CMD", "TTC.CONFIG.CMD_HARD_RESET"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("CALPULSE_CMD", "TTC.CONFIG.CMD_CALPULSE"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("START_CMD", "TTC.CONFIG.CMD_START"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("STOP_CMD", "TTC.CONFIG.CMD_STOP"), - GEMUpdateType::HW32, "hex"); - addMonitorable("TTC", "HWMonitoring", - std::make_pair("TEST_SYNC_CMD", "TTC.CONFIG.CMD_TEST_SYNC"), - GEMUpdateType::HW32, "hex"); - - addMonitorableSet("Trigger Status", "HWMonitoring"); - for (uint8_t oh = 0; oh < p_amc->getSupportedOptoHybrids(); ++oh) { - std::stringstream ohname; - ohname << "OH" << (int)oh; - addMonitorableSet("DAQ Status", "HWMonitoring"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_STATUS", "DAQ."+ohname.str()+".STATUS"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_CORRUPT_VFAT_BLK_CNT", "DAQ."+ohname.str()+".COUNTERS.CORRUPT_VFAT_BLK_CNT"), - GEMUpdateType::HW32, "dec"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_EVN", "DAQ."+ohname.str()+".COUNTERS.EVN"), - GEMUpdateType::HW32, "dec"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_EOE_TIMEOUT", "DAQ."+ohname.str()+".CONTROL.EOE_TIMEOUT"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_MAX_EOE_TIMER", "DAQ."+ohname.str()+".COUNTERS.MAX_EOE_TIMER"), - GEMUpdateType::HW32, "hex"); - addMonitorable("DAQ Status", "HWMonitoring", - std::make_pair(ohname.str()+"_LAST_EOE_TIMER", "DAQ."+ohname.str()+".COUNTERS.LAST_EOE_TIMER"), - GEMUpdateType::HW32, "hex"); - - addMonitorable("Trigger Status", "HWMonitoring", - std::make_pair(ohname.str()+"_TRIGGER_RATE", "TRIGGER."+ohname.str()+".TRIGGER_RATE"), - GEMUpdateType::HW32, "dec"); - addMonitorable("Trigger Status", "HWMonitoring", - std::make_pair(ohname.str()+"_TRIGGER_CNT", "TRIGGER."+ohname.str()+".TRIGGER_CNT"), - GEMUpdateType::HW32, "hex"); - - for (int cluster = 0; cluster < 8; ++cluster) { - std::stringstream cluname; - cluname << "CLUSTER_SIZE_" << cluster; - addMonitorable("Trigger Status", "HWMonitoring", - std::make_pair(ohname.str()+"_"+cluname.str()+"_RATE", "TRIGGER."+ohname.str()+"."+cluname.str()+"_RATE"), - GEMUpdateType::HW32, "dec"); - addMonitorable("Trigger Status", "HWMonitoring", - std::make_pair(ohname.str()+"_"+cluname.str()+"_CNT", "TRIGGER."+ohname.str()+"."+cluname.str()+"_CNT"), - GEMUpdateType::HW32, "hex"); - // cluname.str(""); - // cluname.clear(); - // cluname << "DEBUG_LAST_CLUSTER_" << cluster; - // addMonitorable("Trigger Status", "HWMonitoring", - // std::make_pair(ohname.str()+"_"+cluname.str(), "TRIGGER."+ohname.str()+"."+cluname.str()), - // GEMUpdateType::HW32, "hex"); - } - } - updateMonitorables(); -} - -gem::hw::amc::AMCMonitor::~AMCMonitor() -{ - -} - -void gem::hw::amc::AMCMonitor::updateMonitorables() -{ - // define how to update the desired values - // get SYSTEM monitorables - // can this be split into two loops, one just to do a list read, the second to fill the InfoSpace with the returned values - CMSGEMOS_DEBUG("AMCMonitor: Updating monitorables"); - for (auto monlist = m_monitorableSetsMap.begin(); monlist != m_monitorableSetsMap.end(); ++monlist) { - CMSGEMOS_DEBUG("AMCMonitor: Updating monitorables in set " << monlist->first); - for (auto monitem = monlist->second.begin(); monitem != monlist->second.end(); ++monitem) { - CMSGEMOS_DEBUG("AMCMonitor: Updating monitorable " << monitem->first); - std::stringstream regName; - regName << p_amc->getDeviceBaseNode() << "." << monitem->second.regname; - uint32_t address = p_amc->getNode(regName.str()).getAddress(); - uint32_t mask = p_amc->getNode(regName.str()).getMask(); - if (monitem->second.updatetype == GEMUpdateType::HW8) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::HW16) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::HW24) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::HW32) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::HW64) { - address = p_amc->getNode(regName.str()+".LOWER").getAddress(); - mask = p_amc->getNode(regName.str()+".LOWER").getMask(); - uint32_t lower = p_amc->readReg(address,mask); - address = p_amc->getNode(regName.str()+".UPPER").getAddress(); - mask = p_amc->getNode(regName.str()+".UPPER").getMask(); - uint32_t upper = p_amc->readReg(address,mask); - (monitem->second.infoSpace)->setUInt64(monitem->first, (((uint64_t)upper) << 32) + lower); - } else if (monitem->second.updatetype == GEMUpdateType::I2CSTAT) { - std::stringstream strobeReg; - strobeReg << regName.str() << ".Strobe." << monitem->first; - address = p_amc->getNode(strobeReg.str()).getAddress(); - mask = p_amc->getNode(strobeReg.str()).getMask(); - uint32_t strobe = p_amc->readReg(address,mask); - std::stringstream ackReg; - ackReg << regName.str() << ".Ack." << monitem->first; - address = p_amc->getNode(ackReg.str()).getAddress(); - mask = p_amc->getNode(ackReg.str()).getMask(); - uint32_t ack = p_amc->readReg(address,mask); - (monitem->second.infoSpace)->setUInt64(monitem->first, (((uint64_t)ack) << 32) + strobe); - } else if (monitem->second.updatetype == GEMUpdateType::PROCESS) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::TRACKER) { - (monitem->second.infoSpace)->setUInt32(monitem->first,p_amc->readReg(address,mask)); - } else if (monitem->second.updatetype == GEMUpdateType::NOUPDATE) { - continue; - } else { - CMSGEMOS_ERROR("AMCMonitor: Unknown update type encountered"); - continue; - } - } // end loop over items in list - } // end loop over monitorableSets -} - -void gem::hw::amc::AMCMonitor::buildMonitorPage(xgi::Output* out) -{ - CMSGEMOS_DEBUG("AMCMonitor::buildMonitorPage"); - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - // IMPROVEMENT make the tables dynamically with something like angular/react - // loop over the list of monitor sets and grab the monitorables from each one - // create a div tab for each set, and a table for each set of values - *out << "
" << std::endl; - for (auto monset = monsets.begin(); monset != monsets.end(); ++monset) { - if ((*monset).rfind("DAQ Status") != std::string::npos) { - buildDAQStatusTable(out); - } else if ((*monset).rfind("Trigger Status") != std::string::npos) { - buildTriggerStatusTable(out); - } else { - CMSGEMOS_DEBUG("AMCMonitor::buildMonitorPage building table " << *monset); - *out << "
" << std::endl - << "" << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register name" << cgicc::th() << std::endl - << cgicc::th() << "Value" << cgicc::th() << std::endl - << cgicc::th() << "Register address" << cgicc::th() << std::endl - << cgicc::th() << "Description" << cgicc::th() << std::endl - << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << "" << std::endl; - - for (auto monitem = m_monitorableSetsMap.find(*monset)->second.begin(); - monitem != m_monitorableSetsMap.find(*monset)->second.end(); ++monitem) { - *out << "" << std::endl; - - *out << "" << std::endl; - - CMSGEMOS_DEBUG("AMCMonitor::" << monitem->first << " formatted to " - << (monitem->second.infoSpace)->getFormattedItem(monitem->first,monitem->second.format)); - // this will be repeated for every AMCMonitor in the AMCManager..., need a better unique ID - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - } - *out << "" << std::endl - << "
" << std::endl - << monitem->first - << "second.infoSpace->name() << "-" << monitem->first << "\">" << std::endl - << (monitem->second.infoSpace)->getFormattedItem(monitem->first,monitem->second.format) - << "" << std::endl - << monitem->second.regname - << "" << std::endl - << "description" - << "
" << std::endl - << "
" << std::endl; // closes monset tab - } - } - *out << "
" << std::endl; // closes cardPage tab wrapper -} - -void gem::hw::amc::AMCMonitor::buildDAQStatusTable(xgi::Output* out) -{ - CMSGEMOS_DEBUG("AMCMonitor::buildDAQStatusTable"); - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - if (std::find(monsets.begin(),monsets.end(),"DAQ Status") == monsets.end()) { - CMSGEMOS_WARN("Unable to find item set 'DAQ Status' in list of HWMonitoring monitor sets"); - return; - } - - auto monset = m_monitorableSetsMap.find("DAQ Status")->second; - CMSGEMOS_DEBUG("AMCMonitor::buildDAQStatusTable building DAQ Status table"); - *out << "
" << std::endl - << "
" << std::endl; - - CMSGEMOS_DEBUG("AMCMonitor::buildDAQStatusTable building Common DAQ Status table"); - *out << "
" << std::endl - << "" << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register name" << cgicc::th() << std::endl - << cgicc::th() << "Value" << cgicc::th() << std::endl - << cgicc::th() << "Register address" << cgicc::th() << std::endl - << cgicc::th() << "Description" << cgicc::th() << std::endl - << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << "" << std::endl; - for (auto monpair = monset.begin(); monpair != monset.end(); ++monpair) { - if (monpair->first.find("OH") == std::string::npos) { - *out << "" << std::endl; - - *out << "" << std::endl; - - CMSGEMOS_INFO("AMCMonitor::" << monpair->first << " formatted to " - << (monpair->second.infoSpace)->getFormattedItem(monpair->first,monpair->second.format)); - // this will be repeated for every AMCMonitor in the AMCManager..., need a better unique ID - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - } - } - *out << "" << std::endl; - *out << "
" << std::endl - << monpair->first - << "second.infoSpace->name() << "-" << monpair->first << "\">" << std::endl - << (monpair->second.infoSpace)->getFormattedItem(monpair->first,monpair->second.format) - << "" << std::endl - << monpair->second.regname - << "" << std::endl - << "description" - << "
" << std::endl; - *out << "
" << std::endl; // closes Common DAQ Status tab - - CMSGEMOS_INFO("AMCMonitor::buildDAQStatusTable building Per-link DAQ Status table"); - *out << "
" << std::endl - << "" << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register name" << cgicc::th() << std::endl; - for (int i = 0; i < 12; ++i) - *out << cgicc::th() << "Link " << std::setw(2) << std::setfill(' ') << i << cgicc::th() << std::endl; - - *out << cgicc::th() << "Register address" << cgicc::th() << std::endl - << cgicc::th() << "Description" << cgicc::th() << std::endl - << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << "" << std::endl; - for (auto monpair = monset.begin(); monpair != monset.end(); ++monpair) { - if (monpair->first.find("OH0_STATUS") != std::string::npos) { - CMSGEMOS_INFO("AMCMonitor::buildDAQStatusTable " << monpair->first << " found, building per-link structure"); - std::array linkarray = {{"STATUS", - "EVN", - "EOE_TIMEOUT", - "MAX_EOE_TIMER", - "LAST_EOE_TIMER", - "CORRUPT_VFAT_BLK_CNT"}}; - for (auto regname = linkarray.begin(); regname != linkarray.end(); ++regname) { - // std::string regname = monpair->first; - // regname.erase(regname.rfind("OH0_"),4); - *out << "" << std::endl - << "" << std::endl; - - for (int i = 0; i < 12; ++i) { - CMSGEMOS_INFO("AMCMonitor::buildDAQStatusTable creating OH" << i << " table header"); - std::stringstream substr; - substr << "OH" << i; - *out << "" << std::endl; - } - *out << "" << std::endl - << "" << std::endl - << "" << std::endl; - } - break; - } - } - *out << "" << std::endl - << "
" << std::endl - << *regname - << "second.infoSpace->name() << "-OH" << i << "_" << *regname << "\">" << std::endl - << "N/A" - << "" << std::endl - << "add" - << "" << std::endl - << "desc" - << "
" << std::endl - << "
" << std::endl // closes Per-link DAQ Status tab - << "
" << std::endl // closes DAQ Status tab - << "
" << std::endl; // closes DAQ Status tab-wrapper -} - -void gem::hw::amc::AMCMonitor::buildTriggerStatusTable(xgi::Output* out) -{ - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - if (std::find(monsets.begin(),monsets.end(),"Trigger Status") == monsets.end()) { - CMSGEMOS_WARN("Unable to find item set 'Trigger Status' in list of HWMonitoring monitor sets"); - return; - } - - auto monset = m_monitorableSetsMap.find("Trigger Status")->second; - - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable building Trigger Status table"); - *out << "
" << std::endl - << "" << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register name" << cgicc::th() << std::endl; - for (int i = 0; i < 12; ++i) - *out << cgicc::th() << "Link " << std::setw(2) << std::setfill(' ') << i << cgicc::th() << std::endl; - - *out << cgicc::th() << "Register address" << cgicc::th() << std::endl - << cgicc::th() << "Description" << cgicc::th() << std::endl - << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << "" << std::endl; - for (auto monpair = monset.begin(); monpair != monset.end(); ++monpair) { - if (monpair->first.find("OH0_TRIGGER_RATE") != std::string::npos) { - std::array linkarray = {{"TRIGGER_RATE", "TRIGGER_CNT"}}; - for (auto regname = linkarray.begin(); regname != linkarray.end(); ++regname) { - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable " << monpair->first << " found, building per-link structure"); - *out << "" << std::endl - << "" << std::endl; - - for (int i = 0; i < 12; ++i) { - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable creating OH" << i << " table header"); - *out << "" << std::endl; - } - *out << "" << std::endl - << "" << std::endl - << "" << std::endl; - } - - // std::array linkarray = {{"CLUSTER_SIZE", "DEBUG_LAST_CLUSTER"}}; - std::string regname = "CLUSTER_SIZE"; - for (int j = 0; j < 8; ++j) { - std::stringstream specregname; - specregname << regname << "_" << j << "_CNT"; - *out << "" << std::endl - << "" << std::endl; - - for (int i = 0; i < 12; ++i) { - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable creating OH" << i << " table header"); - *out << "" << std::endl; - } - *out << "" << std::endl - << "" << std::endl - << "" << std::endl; - } - - regname = "CLUSTER_SIZE"; - for (int j = 0; j < 8; ++j) { - std::stringstream specregname; - specregname << regname << "_" << j << "_RATE"; - *out << "" << std::endl - << "" << std::endl; - - for (int i = 0; i < 12; ++i) { - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable creating OH" << i << " table header"); - *out << "" << std::endl; - } - *out << "" << std::endl - << "" << std::endl - << "" << std::endl; - } - - regname = "DEBUG_LAST_CLUSTER"; - for (int j = 0; j < 8; ++j) { - std::stringstream specregname; - specregname << regname << "_" << j; - *out << "" << std::endl - << "" << std::endl; - - for (int i = 0; i < 12; ++i) { - CMSGEMOS_INFO("AMCMonitor::buildTriggerStatusTable creating OH" << i << " table header"); - *out << "" << std::endl; - } - *out << "" << std::endl - << "" << std::endl - << "" << std::endl; - } - break; - } - } - *out << "" << std::endl - << "
" << std::endl - << *regname - << "second.infoSpace->name() << "-OH" << i << "_" << *regname << "\">" << std::endl - << "N/A" - << "" << std::endl - << "add" - << "" << std::endl - << "desc" - << "
" << std::endl - << specregname.str() - << "second.infoSpace->name() << "-OH" << i << "_" << specregname.str() << "\">" << std::endl - << "N/A" - << "" << std::endl - << "add" - << "" << std::endl - << "desc" - << "
" << std::endl - << specregname.str() - << "second.infoSpace->name() << "-OH" << i << "_" << specregname.str() << "\">" << std::endl - << "N/A" - << "" << std::endl - << "add" - << "" << std::endl - << "desc" - << "
" << std::endl - << specregname.str() - << "second.infoSpace->name() << "-OH" << i << "_" << specregname.str() << "\">" << std::endl - << "N/A" - << "" << std::endl - << "add" - << "" << std::endl - << "desc" - << "
" << std::endl - << "
" << std::endl; // closes Trigger Status tab -} - -void gem::hw::amc::AMCMonitor::reset() -{ - // have to get rid of the timer - CMSGEMOS_DEBUG("GEMMonitor::reset"); - for (auto infoSpace = m_infoSpaceMap.begin(); infoSpace != m_infoSpaceMap.end(); ++infoSpace) { - CMSGEMOS_DEBUG("AMCMonitor::reset removing " << infoSpace->first << " from p_timer"); - try { - p_timer->remove(infoSpace->first); - } catch (toolbox::task::exception::Exception const& e) { - CMSGEMOS_ERROR("AMCMonitor::Caught exception while removing timer task " << infoSpace->first << " " << e.what()); - } - } - stopMonitoring(); - CMSGEMOS_DEBUG("GEMMonitor::reset removing timer " << m_timerName << " from timerFactory"); - try { - toolbox::task::getTimerFactory()->removeTimer(m_timerName); - } catch (toolbox::task::exception::Exception const& e) { - CMSGEMOS_ERROR("AMCMonitor::Caught exception while removing timer " << m_timerName << " " << e.what()); - } - - CMSGEMOS_DEBUG("AMCMonitor::reset - clearing all maps"); - m_infoSpaceMap.clear(); - m_infoSpaceMonitorableSetMap.clear(); - m_monitorableSetInfoSpaceMap.clear(); - m_monitorableSetsMap.clear(); -} diff --git a/gemhardware/managers/src/common/amc13/AMC13Manager.cc b/gemhardware/managers/src/common/amc13/AMC13Manager.cc index bc245769..9d8ed625 100644 --- a/gemhardware/managers/src/common/amc13/AMC13Manager.cc +++ b/gemhardware/managers/src/common/amc13/AMC13Manager.cc @@ -155,7 +155,6 @@ gem::hw::amc13::AMC13Manager::AMC13Manager(xdaq::ApplicationStub* stub) : // initialize the AMC13Manager application objects CMSGEMOS_DEBUG("AMC13Manager::connecting to the AMC13ManagerWeb interface"); p_gemWebInterface = new gem::hw::amc13::AMC13ManagerWeb(this); - // p_gemMonitor = new gem::hw::amc13::AMC13HwMonitor(this); CMSGEMOS_DEBUG("AMC13Manager::done"); // CMSGEMOS_DEBUG("AMC13Manager::executing preInit for AMC13Manager"); @@ -182,7 +181,6 @@ void gem::hw::amc13::AMC13Manager::actionPerformed(xdata::Event& event) if (event.type() == "setDefaultValues" || event.type() == "urn:xdaq-event:setDefaultValues") { CMSGEMOS_DEBUG("AMC13Manager::actionPerformed() setDefaultValues" << "Default configuration values have been loaded from xml profile"); - // p_gemMonitor->startMonitoring(); // update configuration variables m_connectionFile = m_amc13Params.bag.connectionFile.value_; m_cardName = m_amc13Params.bag.cardName.value_; diff --git a/gemhardware/managers/src/common/optohybrid/OptoHybridManager.cc b/gemhardware/managers/src/common/optohybrid/OptoHybridManager.cc index 2d3120a6..bbcc5a37 100644 --- a/gemhardware/managers/src/common/optohybrid/OptoHybridManager.cc +++ b/gemhardware/managers/src/common/optohybrid/OptoHybridManager.cc @@ -9,11 +9,10 @@ #include "gem/hw/managers/optohybrid/OptoHybridManager.h" #include "gem/hw/devices/optohybrid/HwOptoHybrid.h" -#include "gem/hw/managers/optohybrid/OptoHybridMonitor.h" #include "gem/hw/managers/optohybrid/OptoHybridManagerWeb.h" -// #include "gem/hw/optohybrid/exception/Exception.h" #include "gem/hw/managers/optohybrid/exception/Exception.h" +#include "gem/hw/managers/exception/Exception.h" #include "gem/hw/devices/exception/Exception.h" #include "gem/utils/exception/Exception.h" @@ -52,23 +51,18 @@ gem::hw::optohybrid::OptoHybridManager::OptoHybridManager(xdaq::ApplicationStub* m_optohybridInfo.setSize(MAX_OPTOHYBRIDS_PER_AMC*MAX_AMCS_PER_CRATE); p_appInfoSpace->fireItemAvailable("AllOptoHybridsInfo", &m_optohybridInfo); - p_appInfoSpace->fireItemAvailable("ConnectionFile", &m_connectionFile); p_appInfoSpace->addItemRetrieveListener("AllOptoHybridsInfo", this); - p_appInfoSpace->addItemRetrieveListener("ConnectionFile", this); p_appInfoSpace->addItemChangedListener( "AllOptoHybridsInfo", this); - p_appInfoSpace->addItemChangedListener( "ConnectionFile", this); // initialize the OptoHybrid application objects CMSGEMOS_DEBUG("OptoHybridManager::Connecting to the OptoHybridManagerWeb interface"); p_gemWebInterface = new gem::hw::optohybrid::OptoHybridManagerWeb(this); - // p_gemMonitor = new gem::hw::optohybrid::OptoHybridHwMonitor(this); CMSGEMOS_DEBUG("OptoHybridManager::done"); // set up the info hwCfgInfoSpace init(); - // getApplicationDescriptor()->setAttribute("icon","/gemdaq/gemhardware/images/optohybrid/OptoHybridManager.png"); } gem::hw::optohybrid::OptoHybridManager::~OptoHybridManager() { @@ -91,7 +85,6 @@ void gem::hw::optohybrid::OptoHybridManager::actionPerformed(xdata::Event& event CMSGEMOS_INFO("OptoHybridManager::Found attribute:" << cfgbag.toString()); } } - // p_gemMonitor->startMonitoring(); } // update monitoring variables gem::base::GEMApplication::actionPerformed(event); @@ -152,84 +145,15 @@ void gem::hw::optohybrid::OptoHybridManager::initializeAction() CMSGEMOS_DEBUG("OptoHybridManager::initializeAction obtaining pointer to HwOptoHybrid " << deviceName << " (slot " << slot+1 << ")" << " (link " << link << ")"); - m_optohybrids.at(slot).at(link) = std::make_shared(deviceName,m_connectionFile.toString()); - } catch (gem::hw::managers::optohybrid::exception::Exception const& e) { - std::stringstream errmsg; - errmsg << "OptoHybridManager::initializeAction caught exception " << e.what(); - CMSGEMOS_ERROR(errmsg.str()); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); - } catch (toolbox::net::exception::MalformedURN const& e) { - std::stringstream errmsg; - errmsg << "OptoHybridManager::initializeAction caught exception " << e.what(); - CMSGEMOS_ERROR(errmsg.str()); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); - } catch (std::exception const& e) { - std::stringstream errmsg; - errmsg << "OptoHybridManager::initializeAction caught exception " << e.what(); - CMSGEMOS_ERROR(errmsg.str()); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); - } - CMSGEMOS_DEBUG("OptoHybridManager::initializeAction connected"); + m_optohybrids.at(slot).at(link) = std::make_shared(deviceName); + auto&& optohybrid = m_optohybrids.at(slot).at(link); + //FIXME what's the purpose of this + createOptoHybridInfoSpaceItems(is_optohybrids.at(slot).at(link), optohybrid); + } GEM_HW_TRANSITION_CATCH("OptoHybridManager::initializeAction",gem::hw::devices::exception::Exception); // set the web view to be empty or grey // if (!info.present.value_) continue; // p_gemWebInterface->optohybridInSlot(slot); - CMSGEMOS_DEBUG("OptoHybridManager::initializeAction grabbing pointer to hardware device"); - auto&& optohybrid = m_optohybrids.at(slot).at(link); - - if (optohybrid->isHwConnected()) { - //FIXME - - /* - m_vfatMapping.at(slot).at(link) = optohybrid->getConnectedVFATs(true); - */ - - m_broadcastList.at(slot).at(link) = ~(optohybrid->getConnectedVFATMask(true)); - m_trackingMask.at(slot).at(link) = m_broadcastList.at(slot).at(link); - m_sbitMask.at(slot).at(link) = m_broadcastList.at(slot).at(link); - - createOptoHybridInfoSpaceItems(is_optohybrids.at(slot).at(link), optohybrid); - CMSGEMOS_INFO("OptoHybridManager::initializeAction looping over created VFAT devices"); - /*FIXME - for (auto const& mapit : m_vfatMapping.at(slot).at(link)) { - CMSGEMOS_INFO("OptoHybridManager::initializeAction VFAT" << static_cast(mapit.first) << " has chipID " - << std::hex << static_cast(mapit.second) << std::dec << " (from map)"); - } - */ - - if (!m_disableMonitoring) { - m_optohybridMonitors.at(slot).at(link) = std::make_shared(optohybrid, this, index); - m_optohybridMonitors.at(slot).at(link)->addInfoSpace("HWMonitoring", is_optohybrids.at(slot).at(link)); - m_optohybridMonitors.at(slot).at(link)->setupHwMonitoring(); - m_optohybridMonitors.at(slot).at(link)->startMonitoring(); - } - - // FIXME V3 MASKS HAVE CHANGED MEANING - CMSGEMOS_INFO("OptoHybridManager::initializeAction OptoHybrid connected on link " - << link << " to AMC in slot " << (slot+1) << std::endl - << " - Tracking mask: 0x" << std::hex << std::setw(8) << std::setfill('0') - << m_trackingMask.at(slot).at(link) - << std::dec << std::endl - << " - Broadcst mask: 0x" << std::hex << std::setw(8) << std::setfill('0') - << m_broadcastList.at(slot).at(link) - << std::dec << std::endl - << " - SBit mask: 0x" << std::hex << std::setw(8) << std::setfill('0') - << m_sbitMask.at(slot).at(link) - << std::dec << std::endl); - - // FIXME may not want to actually force this - optohybrid->setVFATMask(m_trackingMask.at(slot).at(link)); - - // FIXME may not want to actually force this - optohybrid->setSBitMask(m_sbitMask.at(slot).at(link)); - } else { - std::stringstream errmsg; - errmsg << "OptoHybridManager::initializeAction OptoHybrid connected on link " - << link << " to AMC in slot " << (slot+1) << " is not responding"; - CMSGEMOS_ERROR(errmsg.str()); - // fireEvent("Fail"); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); - } } } CMSGEMOS_INFO("OptoHybridManager::initializeAction end"); @@ -238,17 +162,8 @@ void gem::hw::optohybrid::OptoHybridManager::initializeAction() void gem::hw::optohybrid::OptoHybridManager::configureAction() { CMSGEMOS_DEBUG("OptoHybridManager::configureAction"); - - std::map > hwMapping; - // will the manager operate for all connected optohybrids, or only those connected to certain AMCs? // FIXME make me more streamlined for (size_t slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - uint32_t inputMask = 0x0; - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->pauseMonitoring(); - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) { size_t index = (slot*MAX_OPTOHYBRIDS_PER_AMC)+link; CMSGEMOS_DEBUG("OptoHybridManager::index = " << index); @@ -262,95 +177,11 @@ void gem::hw::optohybrid::OptoHybridManager::configureAction() auto&& optohybrid = m_optohybrids.at(slot).at(link); if (optohybrid->isHwConnected()) { - hwMapping[slot+1].insert(link); - - // FIXME UPDATE - // CMSGEMOS_DEBUG("OptoHybridManager::configureAction::setting sbit source to 0x" - // << std::hex << info.sbitSource.value_ << std::dec); - // optohybrid->setSBitSource(info.sbitSource.value_); - // CMSGEMOS_DEBUG("OptoHybridManager::setting reference clock source to 0x" - // << std::hex << info.refClkSrc.value_ << std::dec); - // optohybrid->setReferenceClock(info.refClkSrc.value_); - - // FIXME UPDATE - // CMSGEMOS_DEBUG("OptoHybridManager::setting vfat clock source to 0x" << std::hex << info.vfatClkSrc.value_ << std::dec); - // optohybrid->setVFATClock(info.vfatClkSrc.value_,); - // CMSGEMOS_DEBUG("OptoHybridManager::setting cdce clock source to 0x" << std::hex << info.cdceClkSrc.value_ << std::dec); - // optohybrid->setSBitSource(info.cdceClkSrc.value_); - // for (size_t olink = 0; olink < HwGenericAMC::N_GTX; ++olink) { - // } - - // FIXME UPDATE - // CMSGEMOS_DEBUG("OptoHybridManager::configureAction Setting output s-bit configuration parameters"); - // optohybrid->setHDMISBitMode(info.sbitConfig.bag.Mode.value_); - - // FIXME std::array sbitSources = {{ }}; - // FIXME optohybrid->setHDMISBitSource(sbitSources); - /*FIXME - std::vector > chipIDs = optohybrid->getConnectedVFATs(); - - for (auto const& chip : chipIDs) { - if (chip.second) { - CMSGEMOS_INFO("VFAT found in GEB slot " << std::setw(2) << static_cast(chip.first) << " has ChipID " - << "0x" << std::hex << std::setw(4) << chip.second << std::dec); - } else { - CMSGEMOS_INFO("No VFAT found in GEB slot " << std::setw(2) << static_cast(chip.first)); - } - } - */ - - uint32_t vfatMask = m_broadcastList.at(slot).at(link); - CMSGEMOS_INFO("Setting VFAT parameters with broadcast write using mask " << std::hex << vfatMask << std::dec); - - // FIXME OBSOLETE/UPDATE? - std::map vfatSettings; - - if (m_scanType.value_ == 2) { // FIXME OBSOLETE - CMSGEMOS_INFO("OptoHybridManager::configureAction configureAction: FIRST Latency " << m_scanMin.value_); - vfatSettings["Latency" ] = static_cast(m_scanMin.value_); - // FIXME optohybrid->setVFATsToDefaults(vfatSettings, vfatMask); - // HACK - // FIXME optohybrid->broadcastWrite("VFATChannels.ChanReg23", 0x40, vfatMask); - // FIXME optohybrid->broadcastWrite("VFATChannels.ChanReg124", 0x40, vfatMask); - // FIXME optohybrid->broadcastWrite("VFATChannels.ChanReg65", 0x40, vfatMask); - // FIXME optohybrid->broadcastWrite("VCal", 0xaf, vfatMask); - } else if (m_scanType.value_ == 3) { // FIXME OBSOLETE - uint32_t initialVT1 = m_scanMin.value_; - // FIXME uint32_t VT1 = (m_scanMax.value_ - m_scanMin.value_); - uint32_t initialVT2 = 0; //std::max(0,(uint32_t)m_scanMax.value_); - // FIXME CMSGEMOS_INFO("OptoHybridManager::configureAction FIRST VT1 " << initialVT1 << " VT2 " << initialVT2); - // FIXME vfatSettings["VThreshold1"] = (uint8_t)(initialVT1&0xffff); - // FIXME vfatSettings["VThreshold2"] = (uint8_t)(initialVT2&0xffff); - // FIXME optohybrid->setVFATsToDefaults(vfatSettings, vfatMask); - } else { - // FIXME optohybrid->setVFATsToDefaults(vfatSettings, vfatMask); - } - - CMSGEMOS_INFO("Reading back values after setting defaults:"); + CMSGEMOS_INFO("OptoHybridManager::configureAction:: configuring VFATs"); optohybrid->configureVFATs(); - // auto vfatcfg = optohybrid->readVFATsConfiguration(); - // for (auto const& cfg : vfatcfg) { - // for (auto const& r : cfg) { - // CMSGEMOS_INFO(" 0x" << std::hex << std::setw(8) << std::setfill('0') << r << std::dec); - // } - // } - // what else is required for configuring the OptoHybrid? // need to reset optical links? // reset counters? - - // FIXME, should not be here or done like this - uint32_t gtxMask = optohybrid->readReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK"); - std::stringstream msg; - msg << "OptoHybridManager::configureAction::OptoHybrid connected on link " << static_cast(link) - << " to AMC in slot " << static_cast(slot+1) << " found, INPUT_ENABLE_MASK changed from " - << std::hex << gtxMask << std::dec; - gtxMask |= (0x1<writeReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK", gtxMask); - optohybrid->writeReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK", inputMask); - msg << " to " << std::hex << inputMask << std::dec << std::endl; - CMSGEMOS_INFO(msg.str()); } else { std::stringstream errmsg; errmsg << "OptoHybridManager::configureAction::OptoHybrid connected on link " << static_cast(link) @@ -360,40 +191,20 @@ void gem::hw::optohybrid::OptoHybridManager::configureAction() XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); } } - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->resumeMonitoring(); } - CMSGEMOS_INFO("OptoHybridManager::configureAction end"); } void gem::hw::optohybrid::OptoHybridManager::startAction() { - if (m_scanType.value_ == 2) { - m_lastLatency = m_scanMin.value_; - m_lastVT1 = 0; - } else if (m_scanType.value_ == 3) { - m_lastLatency = 0; - m_lastVT1 = m_scanMin.value_; - } - CMSGEMOS_DEBUG("OptoHybridManager::startAction"); // will the manager operate for all connected optohybrids, or only those connected to certain AMCs? // FIXME make me more streamlined for (size_t slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - uint32_t inputMask = 0x0; - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->pauseMonitoring(); - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) { size_t index = (slot*MAX_OPTOHYBRIDS_PER_AMC)+link; CMSGEMOS_DEBUG("OptoHybridManager::index = " << index); OptoHybridInfo& info = m_optohybridInfo[index].bag; - if (!info.present) continue; @@ -401,40 +212,11 @@ void gem::hw::optohybrid::OptoHybridManager::startAction() auto&& optohybrid = m_optohybrids.at(slot).at(link); if (optohybrid->isHwConnected()) { - // turn on all VFATs? or should they always be on? - uint32_t vfatMask = m_broadcastList.at(slot).at(link); - // reset counters + // FIXME reset counters is doing nothing at the moment! optohybrid->counterReset(); - // // reset VFAT counters - // optohybrid->resetVFATCRCCount(); - - CMSGEMOS_INFO("CFG_RUN: vfatMask = " << std::hex << std::setw(8) << std::setfill('0') << vfatMask); - std::vector res = optohybrid->broadcastRead("CFG_RUN", vfatMask); - for (auto const& r : res) - CMSGEMOS_INFO(" 0x" << std::hex << std::setw(8) << std::setfill('0') << r << std::dec); - - optohybrid->broadcastWrite("CFG_RUN", 0x1, vfatMask); - res.clear(); - res = optohybrid->broadcastRead("CFG_RUN", vfatMask); - CMSGEMOS_INFO("OptoHybridManager::startAction CFG_RUN"); - for (auto const& r : res) - CMSGEMOS_INFO(" 0x" << std::hex << std::setw(8) << std::setfill('0') << r << std::dec); - - // FIXME, should not be here or done like this - uint32_t gtxMask = optohybrid->readReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK"); - std::stringstream msg; - msg << "OptoHybridManager::startAction::OptoHybrid connected on link " << static_cast(link) - << " to AMC in slot " << static_cast(slot+1) << " found, INPUT_ENABLE_MASK changed from " - << std::hex << gtxMask << std::dec; - inputMask |= (0x1<writeReg("GEM_AMC.DAQ.CONTROL.INPUT_ENABLE_MASK", inputMask); - msg.str(""); - msg.clear(); - msg << "OptoHybridManager::startAction::OptoHybrid connected on link " << static_cast(link) - << " to AMC in slot " << static_cast(slot+1) << " found, starting run with INPUT_ENABLE_MASK " - << std::hex << inputMask << std::dec; - CMSGEMOS_INFO(msg.str()); - // what resets to do + //FIXME set VFATs to run mode + //Potentially merge the counter reset in one RPC call + } else { std::stringstream errmsg; errmsg << "OptoHybridManager::startAction::OptoHybrid connected on link " << static_cast(link) @@ -444,85 +226,19 @@ void gem::hw::optohybrid::OptoHybridManager::startAction() XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); } } - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->resumeMonitoring(); } CMSGEMOS_INFO("OptoHybridManager::startAction end"); } void gem::hw::optohybrid::OptoHybridManager::pauseAction() { - // put all connected VFATs into sleep mode? - // FIXME make me more streamlined - for (size_t slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->pauseMonitoring(); - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) { - size_t index = (slot*MAX_OPTOHYBRIDS_PER_AMC)+link; - CMSGEMOS_DEBUG("OptoHybridManager::index = " << index); - OptoHybridInfo& info = m_optohybridInfo[index].bag; - - if (!info.present) - continue; - - CMSGEMOS_DEBUG("OptoHybridManager::pauseAction::grabbing pointer to hardware device"); - auto&& optohybrid = m_optohybrids.at(slot).at(link); - - if (optohybrid->isHwConnected()) { - // turn on all VFATs? or should they always be on? - uint32_t vfatMask = m_broadcastList.at(slot).at(link); - if (m_scanType.value_ == 2) { // FIXME OBSOLETE - uint8_t updatedLatency = m_lastLatency + m_stepSize.value_; - CMSGEMOS_INFO("OptoHybridManager::LatencyScan OptoHybrid on link " << static_cast(link) - << " AMC slot " << (slot+1) << " Latency " << static_cast(updatedLatency)); - - optohybrid->broadcastWrite("Latency", updatedLatency, vfatMask); - } else if (m_scanType.value_ == 3) { // FIXME OBSOLETE - uint8_t updatedVT1 = m_lastVT1 + m_stepSize.value_; - uint8_t VT2 = 0; // std::max(0,static_cast(m_scanMax.value_)); - CMSGEMOS_INFO("OptoHybridManager::ThresholdScan OptoHybrid on link " << static_cast(link) - << " AMC slot " << (slot+1) << " VT1 " << static_cast(updatedVT1) - << " VT2 " << VT2 << " StepSize " << m_stepSize.value_); - - // optohybrid->broadcastWrite("CFG_THR_ARM_DAC", updatedVT1, vfatMask); - // optohybrid->broadcastWrite("CFG_THR_ZCC_DAC", VT2, vfatMask); - } - // what resets to do - } else { - std::stringstream errmsg; - errmsg << "OptoHybridManager::pauseAction OptoHybrid connected on link " << static_cast(link) - << " to AMC in slot " << static_cast(slot+1) << " is not responding"; - CMSGEMOS_ERROR(errmsg.str()); - // fireEvent("Fail"); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); - } - } - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->resumeMonitoring(); - } - // Update the scan parameters - if (m_scanType.value_ == 2) { - CMSGEMOS_INFO("OptoHybridManager::pauseAction LatencyScan old Latency " << static_cast(m_lastLatency)); - m_lastLatency += m_stepSize.value_; - CMSGEMOS_INFO("OptoHybridManager::pauseAction LatencyScan new Latency " << static_cast(m_lastLatency)); - } else if (m_scanType.value_ == 3) { - CMSGEMOS_INFO("OptoHybridManager::pauseAction ThresholdScan old VT1 " << static_cast(m_lastVT1)); - m_lastVT1 += m_stepSize.value_; - CMSGEMOS_INFO("OptoHybridManager::pauseAction ThresholdScan new VT1 " << static_cast(m_lastVT1)); - } + // FIXME put all connected VFATs into run mode? CMSGEMOS_INFO("OptoHybridManager::pauseAction end"); } void gem::hw::optohybrid::OptoHybridManager::resumeAction() { - // put all connected VFATs into run mode? - usleep(10); + // FIXME put all connected VFATs into run mode? CMSGEMOS_INFO("OptoHybridManager::resumeAction end"); } @@ -532,11 +248,6 @@ void gem::hw::optohybrid::OptoHybridManager::stopAction() // FIXME will the manager operate for all connected optohybrids, or only those connected to certain AMCs? // FIXME TODO make me more streamlined for (size_t slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { - uint32_t inputMask = 0x0; - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->pauseMonitoring(); for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) { size_t index = (slot*MAX_OPTOHYBRIDS_PER_AMC)+link; @@ -552,36 +263,9 @@ void gem::hw::optohybrid::OptoHybridManager::stopAction() if (optohybrid->isHwConnected()) { uint32_t vfatMask = m_broadcastList.at(slot).at(link); optohybrid->broadcastWrite("CFG_RUN", 0x0, vfatMask); - // what resets to do - - // FIXME OBSOLETE/UPDATE? - std::map vfatSettings; - - if (m_scanType.value_ == 2) { - // FIXME optohybrid->setVFATsToDefaults(vfatSettings, vfatMask); - // HACK - // have to disable the pulse to the channel if using cal pulse latency scan - // but shouldn't mess with other settings... not possible here, so just a hack - // optohybrid->broadcastWrite("VFATChannels.ChanReg23", 0x00, vfatMask); - // optohybrid->broadcastWrite("VFATChannels.ChanReg124", 0x00, vfatMask); - // optohybrid->broadcastWrite("VFATChannels.ChanReg65", 0x00, vfatMask); - // optohybrid->broadcastWrite("VCal", 0x00, vfatMask); - } else if (m_scanType.value_ == 3) { - // FIXME optohybrid->setVFATsToDefaults(vfatSettings, vfatMask); - } - } else { - std::stringstream errmsg; - errmsg << "OptoHybridManager::stopAction::OptoHybrid connected on link " << static_cast(link) - << " to AMC in slot " << static_cast(slot+1) << " is not responding"; - CMSGEMOS_ERROR(errmsg.str()); - // fireEvent("Fail"); - XCEPT_RAISE(gem::hw::managers::optohybrid::exception::Exception, errmsg.str()); + // FIXME what resets to do } } - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->resumeMonitoring(); } CMSGEMOS_INFO("OptoHybridManager::stopAction end"); } @@ -600,11 +284,6 @@ void gem::hw::optohybrid::OptoHybridManager::resetAction() // FIXME make me more streamlined for (size_t slot = 0; slot < MAX_AMCS_PER_CRATE; ++slot) { CMSGEMOS_DEBUG("OptoHybridManager::looping over slots(" << (slot+1) << ") and finding expected cards"); - uint32_t inputMask = 0x0; - - for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->pauseMonitoring(); for (size_t link = 0; link < MAX_OPTOHYBRIDS_PER_AMC; ++link) { CMSGEMOS_DEBUG("OptoHybridManager::looping over links(" << link << ") and finding expected cards"); @@ -617,10 +296,6 @@ void gem::hw::optohybrid::OptoHybridManager::resetAction() // set up the info space here rather than in initialize (where it can then get unset in reset? // should a value be set up for all of them by default? - // reset the hw monitor - if (m_optohybridMonitors.at(slot).at(link)) - m_optohybridMonitors.at(slot).at(link)->reset(); - CMSGEMOS_DEBUG("OptoHybridManager::revoking hwCfgInfoSpace items for board connected on link " << link << " to AMC in slot " << (slot+1)); toolbox::net::URN hwCfgURN("urn:gem:hw:"+toolbox::toString("gem-shelf%02d-amc%02d-optohybrid%02d", diff --git a/gemhardware/managers/src/common/optohybrid/OptoHybridManagerWeb.cc b/gemhardware/managers/src/common/optohybrid/OptoHybridManagerWeb.cc index a2483de4..0298f350 100644 --- a/gemhardware/managers/src/common/optohybrid/OptoHybridManagerWeb.cc +++ b/gemhardware/managers/src/common/optohybrid/OptoHybridManagerWeb.cc @@ -8,7 +8,6 @@ #include "xcept/tools.h" #include "gem/hw/managers/optohybrid/OptoHybridManager.h" -#include "gem/hw/managers/optohybrid/OptoHybridMonitor.h" #include "gem/hw/managers/optohybrid/exception/Exception.h" @@ -38,17 +37,6 @@ void gem::hw::optohybrid::OptoHybridManagerWeb::webDefault(xgi::Input * in, xgi: GEMWebApplication::webDefault(in, out); } -/*To be filled in with the monitor page code*/ -void gem::hw::optohybrid::OptoHybridManagerWeb::monitorPage(xgi::Input * in, xgi::Output * out) -{ - CMSGEMOS_INFO("OptoHybridManagerWeb::monitorPage"); - //fill this page with the generic views for the OptoHybridManager - //different tabs for certain functions - *out << "
" << std::endl; - *out << "monitorPage
" << std::endl; - *out << "
" << std::endl; -} - /*To be filled in with the expert page code*/ void gem::hw::optohybrid::OptoHybridManagerWeb::expertPage(xgi::Input * in, xgi::Output * out) { @@ -67,46 +55,14 @@ void gem::hw::optohybrid::OptoHybridManagerWeb::applicationPage(xgi::Input* in, *out << " " << std::endl; } -/*To be filled in with the card page code*/ -void gem::hw::optohybrid::OptoHybridManagerWeb::boardPage(xgi::Input* in, xgi::Output* out) +void gem::hw::optohybrid::OptoHybridManagerWeb::monitorPage(xgi::Input * in, xgi::Output * out) { - CMSGEMOS_INFO("OptoHybridManagerWeb::boardPage"); - // fill this page with the card views for the OptoHybridManager - *out << "
" << std::endl; - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - for (unsigned int j = 0; j < gem::base::GEMApplication::MAX_OPTOHYBRIDS_PER_AMC; ++j) { - auto card = dynamic_cast(p_gemFSMApp)->m_optohybridMonitors.at(i).at(j); - if (card) { - *out << "
getDeviceID() << "\" >" << std::endl; - card->buildMonitorPage(out); - *out << "
" << std::endl; - } - } - } - *out << "
" << std::endl; + CMSGEMOS_DEBUG("OptoHybridManagerWeb::monitorPage"); } -void gem::hw::optohybrid::OptoHybridManagerWeb::jsonUpdate(xgi::Input* in, xgi::Output* out) +void gem::hw::optohybrid::OptoHybridManagerWeb::jsonUpdate(xgi::Input * in, xgi::Output * out) { CMSGEMOS_DEBUG("OptoHybridManagerWeb::jsonUpdate"); - out->getHTTPResponseHeader().addHeader("Content-Type", "application/json"); - *out << " { " << std::endl; - for (unsigned int i = 0; i < gem::base::GEMApplication::MAX_AMCS_PER_CRATE; ++i) { - for (unsigned int j = 0; j < gem::base::GEMApplication::MAX_OPTOHYBRIDS_PER_AMC; ++j) { - *out << "\"amcslot" << std::setw(2) << std::setfill('0') << (i+1) - << ".optohybrid" << std::setw(2) << std::setfill('0') << (j) - << "\" : { " << std::endl; - auto card = dynamic_cast(p_gemFSMApp)->m_optohybridMonitors.at(i).at(j); - if (card) { - card->jsonUpdateItemSets(out); - } - // can't have a trailing comma for the last entry... - if (i == (gem::base::GEMApplication::MAX_AMCS_PER_CRATE-1) && - j == (gem::base::GEMApplication::MAX_OPTOHYBRIDS_PER_AMC-1)) - *out << " }" << std::endl; - else - *out << " }," << std::endl; - } - } - *out << " } " << std::endl; } + + diff --git a/gemhardware/managers/src/common/optohybrid/OptoHybridMonitor.cc b/gemhardware/managers/src/common/optohybrid/OptoHybridMonitor.cc deleted file mode 100644 index 8d91307b..00000000 --- a/gemhardware/managers/src/common/optohybrid/OptoHybridMonitor.cc +++ /dev/null @@ -1,414 +0,0 @@ -/** - * class: OptoHybridMonitor - * description: Monitor application for OptoHybrid cards - * structure borrowed from TCDS core, with nods to HCAL and EMU code - * author: J. Sturdy - * date: - */ - -#include "gem/hw/managers/optohybrid/OptoHybridMonitor.h" - -#include -#include -#include - -#include "gem/hw/devices/optohybrid/HwOptoHybrid.h" - -#include "gem/hw/managers/optohybrid/OptoHybridManager.h" - -#include "gem/base/GEMApplication.h" -#include "gem/base/GEMFSMApplication.h" - -typedef gem::base::utils::GEMInfoSpaceToolBox::UpdateType GEMUpdateType; - -gem::hw::optohybrid::OptoHybridMonitor::OptoHybridMonitor(std::shared_ptr optohybrid, - OptoHybridManager* optohybridManager, - int const& index) : - GEMMonitor(optohybridManager->getApplicationLogger(), static_cast(optohybridManager), index), - p_optohybrid(optohybrid) -{ - // application info space is added in the base class constructor - // addInfoSpace("Application", optohybridManager->getApplicationInfoSpace()); - // addInfoSpace("OptoHybrid", p_optohybrid->getHwInfoSpace()); - - // if (!p_optohybrid->getHwInfoSpace()->hasItem(monname)) - // p_optohybrid->getHwInfoSpace()->fireItemAvailable(monname, &monvar); - - updateMonitorables(); -} - - -void gem::hw::optohybrid::OptoHybridMonitor::setupHwMonitoring() -{ - // create the values to be monitored in the info space - addMonitorableSet("Status and Control", "HWMonitoring"); - addMonitorable("Status and Control", "HWMonitoring", - std::make_pair("VFAT_Mask", "VFAT_MASK"), - GEMUpdateType::HW32, "hex"); - addMonitorable("Status and Control", "HWMonitoring", - std::make_pair("SBit_Mask", "FPGA.TRIG.CTRL.VFAT_MASK"), - GEMUpdateType::HW32, "hex"); - // addMonitorable("Status and Control", "HWMonitoring", - // std::make_pair("HDMI SBitsOut", "CONTROL.HDMI_OUTPUT.SBITS"), - // GEMUpdateType::HW32, "hex"); - // addMonitorable("Status and Control", "HWMonitoring", - // std::make_pair("HDMI SBitMode", "CONTROL.HDMI_OUTPUT.SBIT_MODE"), - // GEMUpdateType::HW32, "hex"); - addMonitorable("Status and Control", "HWMonitoring", - std::make_pair("CLK_STATUS", "FPGA.CLOCKING"), - GEMUpdateType::HW32, "bit"); - - addMonitorable("Status and Control", "HWMonitoring", - std::make_pair("FIRMWARE_DATE", "FPGA.CONTROL.RELEASE.DATE"), - GEMUpdateType::HW32, "dateoh"); - addMonitorable("Status and Control", "HWMonitoring", - std::make_pair("FIRMWARE_VERSION", "FPGA.CONTROL.RELEASE.VERSION"), - GEMUpdateType::HW32, "fwveroh"); - - - // FIXME addresses need update, montoring needs revision - addMonitorableSet("TTC Counters", "HWMonitoring"); - std::array ttcsources = {{"GBT_TTC","LOCAL_TTC"}}; - for (auto const& ttcsrc : ttcsources) { - addMonitorable("TTC Counters", "HWMonitoring", - std::make_pair(ttcsrc+"L1A", "COUNTERS.TTC."+ttcsrc+".L1A"), - GEMUpdateType::HW32, "dec"); - addMonitorable("TTC Counters", "HWMonitoring", - std::make_pair(ttcsrc+"Resync", "COUNTERS.TTC."+ttcsrc+".Resync"), - GEMUpdateType::HW32, "dec"); - addMonitorable("TTC Counters", "HWMonitoring", - std::make_pair(ttcsrc+"BC0", "COUNTERS.TTC."+ttcsrc+".BC0"), - GEMUpdateType::HW32, "dec"); - addMonitorable("TTC Counters", "HWMonitoring", - std::make_pair(ttcsrc+"BXN", "COUNTERS.TTC."+ttcsrc+".BXN"), - GEMUpdateType::HW32, "dec"); - } - - addMonitorableSet("Other Counters", "HWMonitoring"); - addMonitorable("Other Counters", "HWMonitoring", - std::make_pair("GTX_TrackingLinkErrors","COUNTERS.GTX_LINK.TRK_ERR"), - GEMUpdateType::PROCESS, "raw/rate"); - addMonitorable("Other Counters", "HWMonitoring", - std::make_pair("GTX_TriggerLinkErrors", "COUNTERS.GTX_LINK.TRG_ERR"), - GEMUpdateType::PROCESS, "raw/rate"); - addMonitorable("Other Counters", "HWMonitoring", - std::make_pair("GTX_DataPackets", "COUNTERS.GTX_LINK.DATA_Packets"), - GEMUpdateType::PROCESS, "raw/rate"); - - addMonitorable("Other Counters", "HWMonitoring", - std::make_pair("GBT_TrackingLinkErrors","COUNTERS.GBT_LINK.TRK_ERR"), - GEMUpdateType::PROCESS, "raw/rate"); - addMonitorable("Other Counters", "HWMonitoring", - std::make_pair("GBT_DataPackets", "COUNTERS.GBT_LINK.DATA_Packets"), - GEMUpdateType::PROCESS, "raw/rate"); - - addMonitorableSet("ADC", "HWMonitoring"); - /* - addMonitorable("ADC", "HWMonitoring", - std::make_pair("ADC_CONTROL","ADC.CONTROL"), - GEMUpdateType::HW32, "hex"); - addMonitorable("ADC", "HWMonitoring", - std::make_pair("ADC_SPY", "ADC.SPY"), - GEMUpdateType::HW32, "hex"); - - for (int adc = 0; adc < N_ADC_CHANNELS; ++adc) { - std::stringstream ss; - ss << "ADC" << adc; - addMonitorable("ADC", "HWMonitoring", - std::make_pair(ss.str(), "OptoHybrid.ADC."+ss.str()), - GEMUpdateType::HW32, "hex"); - } - */ - - updateMonitorables(); -} - -gem::hw::optohybrid::OptoHybridMonitor::~OptoHybridMonitor() -{ - -} - -void gem::hw::optohybrid::OptoHybridMonitor::updateMonitorables() -{ - // define how to update the desired values - // get SYSTEM monitorables - // can this be split into two loops, one just to do a list read, the second to fill the InfoSpace with the returned values - CMSGEMOS_DEBUG("OptoHybridMonitor: Updating monitorables"); - for (auto monlist : m_monitorableSetsMap) { - CMSGEMOS_DEBUG("OptoHybridMonitor: Updating monitorables in set " << monlist.first); - for (auto monitem : monlist.second) { - CMSGEMOS_DEBUG("OptoHybridMonitor: Updating monitorable " << monitem.first); - std::stringstream regName; - regName << p_optohybrid->getDeviceBaseNode() << "." << monitem.second.regname; - uint32_t address = p_optohybrid->getNode(regName.str()).getAddress(); - uint32_t mask = p_optohybrid->getNode(regName.str()).getMask(); - if (monitem.second.updatetype == GEMUpdateType::HW8) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::HW16) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::HW24) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::HW32) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::HW64) { - address = p_optohybrid->getNode(regName.str()+".LOWER").getAddress(); - mask = p_optohybrid->getNode(regName.str()+".LOWER").getMask(); - uint32_t lower = p_optohybrid->readReg(address,mask); - address = p_optohybrid->getNode(regName.str()+".UPPER").getAddress(); - mask = p_optohybrid->getNode(regName.str()+".UPPER").getMask(); - uint32_t upper = p_optohybrid->readReg(address,mask); - (monitem.second.infoSpace)->setUInt64(monitem.first, (((uint64_t)upper) << 32) + lower); - } else if (monitem.second.updatetype == GEMUpdateType::I2CSTAT) { - std::stringstream strobeReg; - strobeReg << regName.str() << ".Strobe." << monitem.first; - address = p_optohybrid->getNode(strobeReg.str()).getAddress(); - mask = p_optohybrid->getNode(strobeReg.str()).getMask(); - uint32_t strobe = p_optohybrid->readReg(address,mask); - std::stringstream ackReg; - ackReg << regName.str() << ".Ack." << monitem.first; - address = p_optohybrid->getNode(ackReg.str()).getAddress(); - mask = p_optohybrid->getNode(ackReg.str()).getMask(); - uint32_t ack = p_optohybrid->readReg(address,mask); - (monitem.second.infoSpace)->setUInt64(monitem.first, (((uint64_t)ack) << 32) + strobe); - } else if (monitem.second.updatetype == GEMUpdateType::PROCESS) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::TRACKER) { - (monitem.second.infoSpace)->setUInt32(monitem.first,p_optohybrid->readReg(address,mask)); - } else if (monitem.second.updatetype == GEMUpdateType::NOUPDATE) { - continue; - } else { - CMSGEMOS_ERROR("OptoHybridMonitor: Unknown update type encountered"); - continue; - } - } // end loop over items in list - } // end loop over monitorableSets -} - -void gem::hw::optohybrid::OptoHybridMonitor::buildMonitorPage(xgi::Output* out) -{ - CMSGEMOS_DEBUG("OptoHybridMonitor::buildMonitorPage"); - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - // IMPROVEMENT make the tables dynamically with something like angular/react - // loop over the list of monitor sets and grab the monitorables from each one - // create a div tab for each set, and a table for each set of values - // for I2C request counters, put strobe/ack in separate columns in same table, rows are the specific request - // for VFAT CRC counters, put valid/invalid in separate columns in same table, rowas are the specific VFAT - // for TTC counters, put each source in separate columns in same table, rows are the commands - *out << "
" << std::endl; - for (auto const& monset : monsets) { - *out << "
" << std::endl; - if (monset.rfind("Firmware Scan Controller") == std::string::npos) { - *out << "" << std::endl - << cgicc::thead() << std::endl - << cgicc::tr() << std::endl // open - << cgicc::th() << "Register name" << cgicc::th() << std::endl; - if (monset.rfind("TTC Counters") != std::string::npos) { - * out << cgicc::th() << "GBT_TTC" << cgicc::th() << std::endl - << cgicc::th() << "LOCAL_TTC" << cgicc::th() << std::endl; - } else if (monset.rfind("Other Counters") != std::string::npos) { - *out << cgicc::th() << "Count" << cgicc::th() << std::endl - << cgicc::th() << "Rate" << cgicc::th() << std::endl; - } else { - *out << cgicc::th() << "Value" << cgicc::th() << std::endl; - } - *out << cgicc::th() << "Register address" << cgicc::th() << std::endl - << cgicc::th() << "Description" << cgicc::th() << std::endl - << cgicc::tr() << std::endl // close - << cgicc::thead() << std::endl - << "" << std::endl; - } - - if (monset.rfind("TTC Counters") != std::string::npos) { - buildTTCCounterTable(out); - } else if (monset.rfind("Other Counters") != std::string::npos) { - buildOtherCounterTable(out); - } else { - for (auto const& monitem : m_monitorableSetsMap.find(monset)->second) { - *out << "" << std::endl; - - std::string formatted = (monitem.second.infoSpace)->getFormattedItem(monitem.first,monitem.second.format); - - *out << "" << std::endl; - - CMSGEMOS_DEBUG("OptoHybridMonitor::" << monitem.first << " formatted to " - << formatted); - //this will be repeated for every OptoHybridMonitor in the OptoHybridManager..., need a better unique ID - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - - *out << "" << std::endl; - } - } // end normal register view class - - if (monset.rfind("Firmware Scan Controller") == std::string::npos) { - *out << "" << std::endl - << "
" << std::endl - << monitem.first - << "name() << "-" << monitem.first << "\">" << std::endl - << formatted - << "" << std::endl - << monitem.second.regname - << "" << std::endl - << "description" - << "
" << std::endl; - } - - *out << "
" << std::endl; - } - *out << "
" << std::endl; - -} - -void gem::hw::optohybrid::OptoHybridMonitor::buildTTCCounterTable(xgi::Output* out) -{ - CMSGEMOS_DEBUG("OptoHybridMonitor::buildTTCCounterTable"); - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - if (std::find(monsets.begin(),monsets.end(),"TTC Counters") == monsets.end()) { - CMSGEMOS_WARN("Unable to find item set 'TTC Counters' in list of HWMonitoring monitor sets"); - return; - } - - // get the list of pairs of monitorables in the TTC Counters monset - auto monset = m_monitorableSetsMap.find("TTC Counters")->second; - - std::array ttcsources = {{"GBT_TTC","LOCAL_TTC"}}; - std::array ttcsignals = {{"L1A","Resync","BC0","BXN"}}; - - for (auto const& ttcsignal : ttcsignals) { - *out << "" << std::endl; - - *out << "" << std::endl - << ttcsignal - << "" << std::endl; - - for (auto const& ttcsource : ttcsources) { - std::string keyname = (ttcsource)+(ttcsignal); - for (auto const& monpair : monset) { - if ((monpair.first).rfind(keyname) == std::string::npos) { - continue; - } - - auto monitem = monpair; - - std::string formatted = (monitem.second.infoSpace)->getFormattedItem(monitem.first, - monitem.second.format); - - CMSGEMOS_DEBUG("OptoHybridMonitor::" << monitem.first << " formatted to " - << formatted); - - *out << "name() << "-" << monitem.first << "\">" << std::endl - << formatted - << "" << std::endl; - } - } - *out << "" << std::endl - << "COUNTERS.TTC.<source>."+(ttcsignal) - << "" << std::endl; - - *out << "" << std::endl - << "Number of " << ttcsignal << " signals received" - << "" << std::endl; - - *out << "" << std::endl; - } -} - - -void gem::hw::optohybrid::OptoHybridMonitor::buildOtherCounterTable(xgi::Output* out) -{ - CMSGEMOS_DEBUG("OptoHybridMonitor::buildOtherCounterTable"); - if (m_infoSpaceMonitorableSetMap.find("HWMonitoring") == m_infoSpaceMonitorableSetMap.end()) { - CMSGEMOS_WARN("Unable to find item set HWMonitoring in monitor"); - return; - } - - auto monsets = m_infoSpaceMonitorableSetMap.find("HWMonitoring")->second; - - if (std::find(monsets.begin(),monsets.end(),"Other Counters") == monsets.end()) { - CMSGEMOS_WARN("Unable to find item set 'Other Counters' in list of HWMonitoring monitor sets"); - return; - } - - // get the list of pairs of monitorables in the Other Counters monset - auto monset = m_monitorableSetsMap.find("Other Counters")->second; - - for (auto const& monitem : monset) { - *out << "" << std::endl; - - std::string formatted = (monitem.second.infoSpace)->getFormattedItem(monitem.first,monitem.second.format); - - *out << "" << std::endl - << monitem.first - << "" << std::endl; - - CMSGEMOS_DEBUG("OptoHybridMonitor::" << monitem.first << " formatted to " - << formatted); - - // count - *out << "name() << "-" << monitem.first << "\">" << std::endl - << formatted - << "" << std::endl; - - // rate - *out << "name() << "-" << monitem.first << "\">" << std::endl - << formatted - << "" << std::endl; - - *out << "" << std::endl - << monitem.second.regname - << "" << std::endl; - - *out << "" << std::endl - << "description" - << "" << std::endl; - - *out << "" << std::endl; - } -} - -std::string gem::hw::optohybrid::OptoHybridMonitor::getDeviceID() -{ - return p_optohybrid->getDeviceID(); -} - -void gem::hw::optohybrid::OptoHybridMonitor::reset() -{ - // have to get rid of the timer - CMSGEMOS_DEBUG("GEMMonitor::reset"); - for (auto infoSpace = m_infoSpaceMap.begin(); infoSpace != m_infoSpaceMap.end(); ++infoSpace) { - CMSGEMOS_DEBUG("OptoHybridMonitor::reset removing " << infoSpace->first << " from p_timer"); - try { - p_timer->remove(infoSpace->first); - } catch (toolbox::task::exception::Exception const& e) { - CMSGEMOS_ERROR("OptoHybridMonitor::Caught exception while removing timer task " << infoSpace->first << " " << e.what()); - } - } - stopMonitoring(); - CMSGEMOS_DEBUG("GEMMonitor::reset removing timer " << m_timerName << " from timerFactory"); - try { - toolbox::task::getTimerFactory()->removeTimer(m_timerName); - } catch (toolbox::task::exception::Exception const& e) { - CMSGEMOS_ERROR("OptoHybridMonitor::Caught exception while removing timer " << m_timerName << " " << e.what()); - } - - CMSGEMOS_DEBUG("OptoHybridMonitor::reset - clearing all maps"); - m_infoSpaceMap.clear(); - m_infoSpaceMonitorableSetMap.clear(); - m_monitorableSetInfoSpaceMap.clear(); - m_monitorableSetsMap.clear(); -} diff --git a/gemhardware/xml/amc13/amc13_manager_tamu.xml b/gemhardware/xml/amc13/amc13_manager_tamu.xml deleted file mode 100644 index 7c62740b..00000000 --- a/gemhardware/xml/amc13/amc13_manager_tamu.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - connectionSN83_ch.xml - 11 - 1-10,12 - - true - false - true - true - true - - 1 - 1 - - 1 - 1 - 1 - - 1 - - - - - - - ${XDAQ_ROOT}/lib/libxdaq2rc.so - - ${BUILD_HOME}/${GEM_OS_PROJECT}/gembase/lib/${XDAQ_OS}/${XDAQ_PLATFORM}/libgembase.so - ${BUILD_HOME}/${GEM_OS_PROJECT}/gemutils/lib/${XDAQ_OS}/${XDAQ_PLATFORM}/libgemutils.so - ${BUILD_HOME}/${GEM_OS_PROJECT}/gemhardware/lib/${XDAQ_OS}/${XDAQ_PLATFORM}/libgemhardware.so - ${BUILD_HOME}/${GEM_OS_PROJECT}/gemsupervisor/lib/${XDAQ_OS}/${XDAQ_PLATFORM}/libgemsupervisor.so - - - - - -