RMM API 2.0.0
Loading...
Searching...
No Matches
RMMRings.h
1#pragma once
2
3#include <chrono>
4#include <future>
5#include <iostream>
6#include <memory>
7#include <mutex>
8#include <string>
9#include <thread>
10#include <unordered_map>
11#include <vector>
12
13#include "RMMRegisterAccess.h"
14#include "RMMRing.h"
15#include "RMMRingTimestamps.h"
16#include "RingId.h"
17
24 uint32_t oddCount;
25 uint32_t evenCount;
26 uint32_t oddOverflow;
27 uint32_t evenOverflow;
28 std::map<int, uint32_t> perNode;
29};
30
35using PacketCountMap = std::map<uint8_t, PacketCountsData>;
36
44class RMMRings {
45 public:
52
53 rmmStatus teardownAllRings();
54 rmmStatus tearDownRing(RingId ringId, bool waitTime = true);
55 rmmStatus bringup(RingId ringId);
56 void bringUpAllRings();
58 ringStatus checkRings();
59 ringStatus checkRings(std::vector<int> &failedRings);
60 ringStatus checkRing(RingId ringId);
62 rmmStatus getPacketCounters(PacketCountMap *packets);
63 rmmStatus getSideChannelPacketCounter(uint8_t node, uint32_t *value);
64 uint32_t getNumberOfNodes(RingId ringId);
65 void initialConfig();
66 rmmStatus setRingEnabled(RingId ringId, bool enable);
67
69 static constexpr int FE_DEFAULT_LOCK_TIME = 16;
70
71 rmmStatus setRingLogMask(RingId ringId, int mask);
72 std::vector<int> getActiveRings() const;
73 RMMRing &getRing(RingId ringId);
74 bool isRingActive(RingId ringId);
75
76 int getPollTimeout();
77 void setPollTimeout(int value);
78 void setRingPollTimeout(RingId ringId, int value);
79 int getRingPollTimeout(RingId ringId);
80
81 RingState getRingStatus(RingId ringId) const;
82
83 void addFrontEndToRing(RingId ringId, std::shared_ptr<FrontEndBase> frontend);
84
86 rmmStatus getRingLogMsg(std::string *msg, RingId ringId);
87
88 rmmStatus startBulkData();
89 rmmStatus startRingBulkData(RingId ringId);
90
91 private:
92 static constexpr int BUCKET_SIZE = 7;
93 std::array<std::unique_ptr<RMMRing>, RingId::MAX_NUM_RINGS> rings_;
94 std::array<uint32_t, RingId::MAX_NUM_RINGS> pollTimeouts_{};
95 std::atomic<uint32_t> pollTimeout_{10};
96
97 RMMRegisterAccess &RMMRegs;
98 std::mutex beStateMutex_;
99
100 std::atomic<bool> _stopRequested{false};
101
102 void setDomXcvr(DomFiber val);
103
104 bool isInitialConfigDone();
105};
Class for managing and writing log messages to different log levels and files.
Definition RMMLog.h:52
Class to handle register access over the ESS Readout Master Module.
Definition RMMRegisterAccess.h:57
Classe to manage the setup, configuration, and teardown of RMM ring.
Definition RMMRing.h:36
rmmStatus bringup(RingId ringId)
Bringup a ring.
Definition RMMRings.cpp:182
int getPollTimeout()
Gets the timeout for polling in seconds.
Definition RMMRings.cpp:429
static constexpr int FE_DEFAULT_LOCK_TIME
Seconds typical for a FE jitter cleaner to lock to 95BC.
Definition RMMRings.h:69
RMMRings(RMMRegisterAccess &RMMRegs)
Constructor for the RMMRings instance.
Definition RMMRings.cpp:5
std::vector< int > getActiveRings() const
Retrieves a list of indices for all currently active rings.
Definition RMMRings.cpp:36
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:355
void configureAllNodesInRing(RingId ringId)
Iterates through all Front-End Nodes (FENs) in a ring and triggers their configuration.
Definition RMMRings.cpp:466
rmmStatus getRingLogMsg(std::string *msg, RingId ringId)
Retrieves the latest log message from a specific ring's internal logger.
Definition RMMRings.cpp:480
RingState getRingStatus(RingId ringId) const
Retrieves a snapshot of the current status for a specific ring.
Definition RMMRings.cpp:90
rmmStatus getSideChannelPacketCounter(uint8_t node, uint32_t *value)
Retrieves the packet counter value for a specific side channel.
Definition RMMRings.cpp:409
void resetPacketCounters()
Reset all packet counters back to 0. Useful if the counters start saturating at 0xFFFF_FFFF.
Definition RMMRings.cpp:337
rmmStatus teardownAllRings()
Teardown all possible rings.
Definition RMMRings.cpp:142
void setPollTimeout(int value)
Sets the timeout for polling in seconds. Timeout starts counting after the polling exceeds initial es...
Definition RMMRings.cpp:437
void addFrontEndToRing(RingId ringId, std::shared_ptr< FrontEndBase > frontend)
Registers a Front-End Node (FEN) to a specific ring.
Definition RMMRings.cpp:23
void bringUpAllRings()
Initializes and configures all active rings.
Definition RMMRings.cpp:198
void bringUpAllRingsInSequence()
Initializes and configures all active rings, one by one.
Definition RMMRings.cpp:226
bool isRingActive(RingId ringId)
Checks if a specific ring is initialized and operational.
Definition RMMRings.cpp:68
void setRingPollTimeout(RingId ringId, int value)
Sets the polling timeout value for a specific ring.
Definition RMMRings.cpp:448
rmmStatus setRingEnabled(RingId ringId, bool enable)
Sets the software-level enabled status for the specified ring.
Definition RMMRings.cpp:79
ringStatus checkRing(RingId ringId)
Perform a slow control read from all FEs in the ring.
Definition RMMRings.cpp:297
RMMLog rmmLog
Log handler for RMMRings messages.
Definition RMMRings.h:68
rmmStatus setRingLogMask(RingId ringId, int mask)
Set the log mask for a specific ring.
Definition RMMRings.cpp:103
ringStatus checkRings()
Perform a slow control read from all FEs to confirm rings are active.
Definition RMMRings.cpp:303
RMMRing & getRing(RingId ringId)
Provides direct access to a specific RMMRing object.
Definition RMMRings.cpp:60
rmmStatus startBulkData()
Inform all FEs in the topology that they can start sending bulk data.
Definition RMMRings.cpp:485
void initialConfig()
Executes the initial RMM setup ready to bring up the rings.
Definition RMMRings.cpp:264
rmmStatus tearDownRing(RingId ringId, bool waitTime=true)
Teardown a specific ring of the RMM.
Definition RMMRings.cpp:132
uint32_t getNumberOfNodes(RingId ringId)
Retrieves the total number of Front-End Nodes registered in this ring.
Definition RMMRings.cpp:50
int getRingPollTimeout(RingId ringId)
Retrieves the current polling timeout value of a specific ring.
Definition RMMRings.cpp:456
rmmStatus startRingBulkData(RingId ringId)
Inform all FEs in the ring that they can start sending bulk data.
Definition RMMRings.cpp:502
Type-safe wrapper for a Ring index. This class ensures that a ring index is valid and within the boun...
Definition RingId.h:10
static constexpr std::size_t MAX_NUM_RINGS
Maximum number of rings supported by the RMM system.
Definition RingId.h:15
Struct to hold the packet count statistics for a ring or node. This structure stores packet counters,...
Definition RMMRings.h:23
uint32_t oddOverflow
Overflow count for odd packets.
Definition RMMRings.h:26
uint32_t oddCount
Count of odd bulk data packets.
Definition RMMRings.h:24
std::map< int, uint32_t > perNode
Per-node packet counters.
Definition RMMRings.h:28
uint32_t evenOverflow
Overflow count for even packets.
Definition RMMRings.h:27
uint32_t evenCount
Count of even bulk data packets.
Definition RMMRings.h:25
Represents the current operational status and topology information of a ring.
Definition RMMRing.h:27