10#include <unordered_map>
13#include "RMMRegisterAccess.h"
14#include "RMMRingTimestamps.h"
16using json = nlohmann::json;
18constexpr int MAX_NUM_RINGS = 12;
19constexpr int MAX_NODES_PER_RING = 31;
21constexpr int FE_WATCHDOG_TIMEOUT = 30;
22constexpr int STATUS_UPDATE_GAP = 1;
24enum class FSMState { IDLE = 0, SYNC = 1, SLOW_CTRL = 2 };
43using PacketCountMap = std::map<uint8_t, PacketCountsData>;
75 static constexpr int FE_DEFAULT_LOCK_TIME = 16;
78 static constexpr int NODE_STATUS_ATTEMPTING_LOCK = 1;
79 static constexpr int NODE_STATUS_LOCKED = 2;
80 static constexpr int NODEID_ON_RESET = 31;
81 static constexpr int BUCKET_SIZE = 7;
85 std::mutex cout_mutex;
86 std::mutex tearing_down[MAX_NUM_RINGS];
88 std::atomic<bool> _stopRequested{
false};
90 void commonRingSetup();
91 uint32_t getCfgMask();
92 rmmStatus ringSetup(
int ring);
94 RMMResult maskedSetXcvrEngineState(
int ring, std::string txrx, FSMState fsm_st,
bool use_dom_xcvr =
true);
95 std::string get3regSuffix(
int ring);
96 int getXcvrNum(
int ring,
bool use_dom_xcvr =
true);
97 int getXcvrOffset(
bool use_dom_xcvr =
true);
98 rmmStatus nodeSetup(
int ring,
int node);
99 rmmStatus finalRingSetup(
int ring,
int final_node_id);
100 void finalEnterSlowCtrl(
int ring);
101 void updateTouchScreenRingStatusRegister(
int current_node,
int ring,
int lock_status,
bool ring_complete);
102 void beginNodeSync(
int ring,
bool use_dom_xcvr =
true);
103 RMMResult pollForLock(
int ring,
int node,
bool use_dom_xcvr =
true);
104 void enterSlowCtrl(
int ring,
bool use_dom_xcvr);
106 void setDomXcvr(DomFiber val);
107 void setNonDomXcvr(
int val);
109 std::atomic<int> poll_timeout{10};
111 friend class FrontEndBase;
Class for managing and writing log messages to different log levels and files.
Definition RMMLog.h:47
Class to handle register access over the ESS Readout Master Module.
Definition RMMRegisterAccess.h:57
rmmStatus tearDownRing(int ring, bool waitTime=true)
Teardown a specific ring of the RMM.
Definition RMMRings.cpp:48
int getPollTimeout()
Gets the timeout for polling in seconds.
Definition RMMRings.cpp:675
rmmStatus getPacketCounters(PacketCountMap *packets)
Return the updated packet counters.. There are 2 types of counters, one set that counts the per-fibre...
Definition RMMRings.cpp:601
rmmStatus getSideChannelPacketCounter(uint8_t node, uint32_t *value)
Retrieves the packet counter value for a specific side channel.
Definition RMMRings.cpp:655
void resetPacketCounters()
Reset all packet counters back to 0. Useful if the counters start saturating at 0xFFFF_FFFF.
Definition RMMRings.cpp:583
rmmStatus teardownAllRings()
Teardown all possible rings.
Definition RMMRings.cpp:104
void setPollTimeout(int value)
Sets the timeout for polling in seconds. Timeout starts counting after the polling exceeds initial es...
Definition RMMRings.cpp:685
void bringUpAllRings()
Initializes and configures all active rings.
Definition RMMRings.cpp:140
void bringUpAllRingsInSequence()
Initializes and configures all active rings, one by one.
Definition RMMRings.cpp:167
RMMLog rmmLog
Log handler for RMMRings messages.
Definition RMMRings.h:74
ringStatus checkRings()
Perform a slow control read from all FEs in the topology to confirm the ring is active.
Definition RMMRings.cpp:395
RMMRings(RMMRegisterAccess &RMMRegs, Topology &topology)
Constructor for the RMMRings instance.
Definition RMMRings.cpp:5
void readyForBulkData()
Inform all FEs in the topology that they can start sending bulk data.
Definition RMMRings.cpp:414
Class to manage the topology of frontend devices.
Definition Topology.h:40
Struct to hold the packet count statistics for a ring or node. This structure stores packet counters,...
Definition RMMRings.h:31
uint32_t oddOverflow
Overflow count for odd packets.
Definition RMMRings.h:34
uint32_t oddCount
Count of odd bulk data packets.
Definition RMMRings.h:32
std::map< int, uint32_t > perNode
Per-node packet counters.
Definition RMMRings.h:36
uint32_t evenOverflow
Overflow count for even packets.
Definition RMMRings.h:35
uint32_t evenCount
Count of even bulk data packets.
Definition RMMRings.h:33
Struct to represent the result of an RMM register operation.
Definition RMMRegisterAccess.h:37