diff --git a/gemhardware/interface/amc/ttc.h b/gemhardware/interface/amc/ttc.h index 2fec07f6c5050bee8fa34d71d0f5781bdd906885..9252202c2b76b0f4f98873039b24de592782bed0 100644 --- a/gemhardware/interface/amc/ttc.h +++ b/gemhardware/interface/amc/ttc.h @@ -23,11 +23,17 @@ namespace hardware { struct sendSingleHardReset : public xhal::common::Method { void operator()() const; }; + /// @brief Send a single ReSync with the TTC generator struct sendSingleReSync : public xhal::common::Method { void operator()() const; }; + /// @brief Send a (pseudo) ReSync sequence with the TTC generator + struct sendReSyncSequence : public xhal::common::Method { + void operator()() const; + }; + /// @brief Reset the TTC module struct ttcModuleReset : public xhal::common::Method { void operator()() const; diff --git a/gemhardware/rpc/gemhardwarerpc.cpp b/gemhardware/rpc/gemhardwarerpc.cpp index 04243318f4ac3f5ab34811d93beb90cac6003b5d..e4445302db7e407e1e5f6b9601b19a2fb1cda748 100644 --- a/gemhardware/rpc/gemhardwarerpc.cpp +++ b/gemhardware/rpc/gemhardwarerpc.cpp @@ -99,6 +99,7 @@ void module_init(ModuleManager* modmgr) xhal::server::registerMethod<gem::hardware::amc::ttc::getL1AEnable>(modmgr); xhal::server::registerMethod<gem::hardware::amc::ttc::getL1AID>(modmgr); xhal::server::registerMethod<gem::hardware::amc::ttc::getL1ARate>(modmgr); + xhal::server::registerMethod<gem::hardware::amc::ttc::sendReSyncSequence>(modmgr); xhal::server::registerMethod<gem::hardware::amc::ttc::sendSingleHardReset>(modmgr); xhal::server::registerMethod<gem::hardware::amc::ttc::sendSingleReSync>(modmgr); xhal::server::registerMethod<gem::hardware::amc::ttc::setL1AEnable>(modmgr); diff --git a/gemhardware/src/amc/ttc.cpp b/gemhardware/src/amc/ttc.cpp index 32250d8264cddd6aab81a4c1ad9d99f3c7fa09e5..110be56667d30072886ec05210e5386994ebfcf0 100644 --- a/gemhardware/src/amc/ttc.cpp +++ b/gemhardware/src/amc/ttc.cpp @@ -38,6 +38,19 @@ void gem::hardware::amc::ttc::sendSingleReSync::operator()() const } } +void gem::hardware::amc::ttc::sendReSyncSequence::operator()() const +{ + if (utils::readReg("BEFE.GEM.TTC.GENERATOR.ENABLE")) { + utils::writeReg("BEFE.GEM.TTC.GENERATOR.SINGLE_RESYNC", 0x1); + utils::writeReg("BEFE.GEM.TTC.GENERATOR.SINGLE_EC0", 0x1); + } else { + utils::writeReg("BEFE.GEM.TTC.GENERATOR.ENABLE", 0x1); + utils::writeReg("BEFE.GEM.TTC.GENERATOR.SINGLE_RESYNC", 0x1); + utils::writeReg("BEFE.GEM.TTC.GENERATOR.SINGLE_EC0", 0x1); + utils::writeReg("BEFE.GEM.TTC.GENERATOR.ENABLE", 0x0); + } +} + void gem::hardware::amc::ttc::ttcModuleReset::operator()() const { utils::writeReg("BEFE.GEM.TTC.CTRL.MODULE_RESET", 0x1); diff --git a/gemmanagers/interface/AMC13Manager.h b/gemmanagers/interface/AMC13Manager.h index 68540b726b46d57c0932b7e518f159a160e5698d..ad4db79b697685992a9da580fd2137a3b0141ad8 100644 --- a/gemmanagers/interface/AMC13Manager.h +++ b/gemmanagers/interface/AMC13Manager.h @@ -88,6 +88,7 @@ protected: xdata::String amcIgnoreTTSList = ""; xdata::Integer bcOffset = 0; xdata::Vector<xdata::Bag<BGOInfo>> bgoConfig = { /* empty */ }; // Up to 4 + xdata::Boolean enableDAQ = true; xdata::Boolean enableDAQLink = false; xdata::Boolean enableFakeData = false; xdata::Boolean enableLocalTTC = false; @@ -118,7 +119,7 @@ private: // seems that we've duplicated the members of the m_amc13Params as class variables themselves // what is the reason for this? is it necessary/better to have these variables? std::string m_connectionFile, m_cardName, m_amcInputEnableList, m_slotEnableList, m_amcIgnoreTTSList; - bool m_enableDAQLink, m_enableFakeData; + bool m_enableDAQ, m_enableDAQLink, m_enableFakeData; bool m_monBackPressEnable, m_megaMonitorScale; bool m_enableLocalTTC, m_skipPLLReset, m_enableLocalL1A, m_sendL1ATriburst, m_startL1ATricont, // need to remove diff --git a/gemmanagers/src/AMC13Manager.cpp b/gemmanagers/src/AMC13Manager.cpp index 1c73341462fe30e85ff53ef246e805bec4e34a3b..e8eac4e6a9dfe21f5074f3f9bc00992212185052 100644 --- a/gemmanagers/src/AMC13Manager.cpp +++ b/gemmanagers/src/AMC13Manager.cpp @@ -87,6 +87,7 @@ void gem::managers::AMC13Manager::AMC13Info::registerFields(xdata::Bag<AMC13Info bag->addField("AMCInputEnableList", &amcInputEnableList); bag->addField("BCOffset", &bcOffset); bag->addField("BGOConfig", &bgoConfig); + bag->addField("EnableDAQ", &enableDAQ); bag->addField("EnableDAQLink", &enableDAQLink); bag->addField("EnableFakeData", &enableFakeData); bag->addField("EnableLocalTTC", &enableLocalTTC); @@ -110,7 +111,8 @@ std::string gem::managers::AMC13Manager::AMC13Info::toString() const for (auto bgo = bgoConfig.begin(); bgo != bgoConfig.end(); ++bgo) os << " " << bgo->bag.toString() << std::endl; - os << "enableDAQLink: " << enableDAQLink.toString() << std::endl + os << "enabeDAQ: " << enableDAQ.toString() << std::endl + << "enableDAQLink: " << enableDAQLink.toString() << std::endl << "enableFakeData: " << enableFakeData.toString() << std::endl << "enableLocalTTC: " << enableLocalTTC.toString() << std::endl << "localTriggerConfig: " << localTriggerConfig.bag.toString() << std::endl @@ -158,6 +160,7 @@ void gem::managers::AMC13Manager::actionPerformed(xdata::Event& event) // Update configuration variables m_amcInputEnableList = m_amc13Params.bag.amcInputEnableList.value_; m_amcIgnoreTTSList = m_amc13Params.bag.amcIgnoreTTSList.value_; + m_enableDAQ = m_amc13Params.bag.enableDAQ.value_; m_enableDAQLink = m_amc13Params.bag.enableDAQLink.value_; m_enableFakeData = m_amc13Params.bag.enableFakeData.value_; m_monBackPressEnable = m_amc13Params.bag.monBackPressure.value_; @@ -270,6 +273,7 @@ void gem::managers::AMC13Manager::initializeAction() p_amc13->fakeDataEnable(m_enableFakeData); p_amc13->daqLinkEnable(m_enableDAQLink); + p_amc13->daqIgnore(!m_enableDAQ); // enable SFP outputs based on mask configuration p_amc13->sfpOutputEnable(m_sfpMask); diff --git a/gemmanagers/src/AMCManager.cpp b/gemmanagers/src/AMCManager.cpp index 990a1668ad719df39fc4cb05843428b641a90274..f7b19f6736cffce7bb9802b0312045adfb0d5f12 100644 --- a/gemmanagers/src/AMCManager.cpp +++ b/gemmanagers/src/AMCManager.cpp @@ -346,11 +346,11 @@ void gem::managers::AMCManager::startAction() if (m_ttc_generator_enabled) { // Reset the OC, BC, and EC m_connection->call<gem::hardware::amc::ttc::ttcModuleReset>(); - m_connection->call<gem::hardware::amc::ttc::sendSingleReSync>(); + m_connection->call<gem::hardware::amc::ttc::sendReSyncSequence>(); } else { m_connection->call<gem::hardware::amc::ttc::setL1AEnable>(true); // FIXME: Remove when the AMC13 in loopback mode will send a ReSync - m_connection->call<gem::hardware::amc::ttc::sendSingleReSync>(); + m_connection->call<gem::hardware::amc::ttc::sendReSyncSequence>(); } m_connection->call<gem::hardware::amc::ttc::ttcCounterReset>();