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 <json.hpp>
7#include <mutex>
8#include <string>
9#include <thread>
10#include <unordered_map>
11#include <vector>
12
13#include "RMMRegisterAccess.h"
14#include "RMMRingTimestamps.h"
15#include "Topology.h"
16using json = nlohmann::json;
17
18constexpr int MAX_NUM_RINGS = 12;
19constexpr int MAX_NODES_PER_RING = 31;
20
21constexpr int FE_WATCHDOG_TIMEOUT = 30; // seconds
22constexpr int STATUS_UPDATE_GAP = 1; // seconds
23
24enum class FSMState { IDLE = 0, SYNC = 1, SLOW_CTRL = 2 };
25
32 uint32_t oddCount;
33 uint32_t evenCount;
34 uint32_t oddOverflow;
35 uint32_t evenOverflow;
36 std::map<int, uint32_t> perNode;
37};
38
43using PacketCountMap = std::map<uint8_t, PacketCountsData>;
44
52class RMMRings {
53 public:
60 RMMRings(RMMRegisterAccess& RMMRegs, Topology& topology);
61
62 rmmStatus teardownAllRings();
63 rmmStatus tearDownRing(int ring, bool waitTime = true);
64 void bringUpAllRings();
66 ringStatus checkRings();
67 void readyForBulkData();
69 int getPollTimeout();
70 void setPollTimeout(int value);
71 rmmStatus getPacketCounters(PacketCountMap* packets);
72 rmmStatus getSideChannelPacketCounter(uint8_t node, uint32_t* value);
73
75 static constexpr int FE_DEFAULT_LOCK_TIME = 16; // seconds, typical for a FE jitter cleaner to lock to 95BC.
76
77 private:
78 static constexpr int NODE_STATUS_ATTEMPTING_LOCK = 1; // microblaze touchscreen status
79 static constexpr int NODE_STATUS_LOCKED = 2; // microblaze touchscreen status
80 static constexpr int NODEID_ON_RESET = 31; // 0-indexed nodeid's (31 reserved for 'unassigned')
81 static constexpr int BUCKET_SIZE = 7;
82
83 RMMRegisterAccess& RMMRegs;
84 Topology& topology_;
85 std::mutex cout_mutex; // Mutex for std::cout
86 std::mutex tearing_down[MAX_NUM_RINGS];
87
88 std::atomic<bool> _stopRequested{false};
89
90 void commonRingSetup();
91 uint32_t getCfgMask();
92 rmmStatus ringSetup(int ring);
93
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);
105
106 void setDomXcvr(DomFiber val);
107 void setNonDomXcvr(int val);
108
109 std::atomic<int> poll_timeout{10};
110
111 friend class FrontEndBase;
112};
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