RMM API 2.0.0
Loading...
Searching...
No Matches
RMMRing.h
1#pragma once
2
3#include <chrono>
4#include <future>
5#include <iostream>
6#include <mutex>
7#include <string>
8#include <thread>
9#include <unordered_map>
10#include <vector>
11
12#include "OptionalLock.h"
13#include "RMMRegisterAccess.h"
14#include "RMMRingTimestamps.h"
15class FrontEndBase; // Forward class declaration
16
17constexpr int FE_WATCHDOG_TIMEOUT = 30; // seconds
18constexpr int STATUS_UPDATE_GAP = 1; // seconds
19constexpr int MAX_NUMBER_NODES = 16;
20
21enum class FSMState { IDLE = 0, SYNC = 1, SLOW_CTRL = 2 };
22
27struct RingState {
28 bool enabled = true;
29 bool inTopology = false;
30 uint32_t nodeCount = 0;
31};
32
36class RMMRing {
37 public:
46 RMMRing(uint32_t ringId, RMMRegisterAccess& regs, std::mutex* beMutex = nullptr);
47 uint32_t getNumberOfFENs() const;
48
49 void addEntry(std::shared_ptr<FrontEndBase> fen);
50 void setLogMask(int mask);
51 ringStatus check();
52 rmmStatus tearDown(bool waitTime = true);
53 rmmStatus bringup();
54
55 int getPollTimeout();
56 void setPollTimeout(int value);
57
58 RingState getStatus() const;
59
64 bool isOperational() const { return enabled_ && getNumberOfFENs() > 0; };
65 rmmStatus setEnabled(bool enable);
66
67 FrontEndBase* getFEN(int node);
69
70 rmmStatus startSendingBulkData();
71
72 private:
73 uint32_t ringId_;
74 RMMRegisterAccess& regs_;
75 std::mutex* beStateMutex_;
76
77 std::mutex teardownMutex_;
78 std::mutex fensMutex_;
79
80 std::vector<std::shared_ptr<FrontEndBase>> fens_;
81
82 std::atomic<bool> enabled_{true};
83
84 static constexpr int TS_NODE_STATUS_ATTEMPTING_LOCK = 1;
85 static constexpr int TS_NODE_STATUS_LOCKED = 2;
86 static constexpr int NODEID_ON_RESET = 31; // 0-indexed nodeid's (31 reserved for 'unassigned')
87
88 RMMResult maskedSetXcvrEngineState(std::string txrx, FSMState fsm_st, bool use_dom_xcvr = true);
89 std::string get3regSuffix();
90 int getXcvrNum(bool use_dom_xcvr);
91 void updateTouchScreen(int currentNode, int lockStatus, bool ringComplete);
92
93 rmmStatus setupNode(int node);
94 rmmStatus finalSetup(int finalNodeId);
95 void finalEnterSlowCtrl();
96 void beginNodeSync(bool useDomXcvr);
97 RMMResult pollForLock(int node, bool useDomXcvr = true);
98 void enterSlowCtrl(bool useDomXcvr = true);
99
100 std::atomic<int> poll_timeout{10};
101 bool inTopology() const;
102
103 friend class FrontEndBase;
104};
Base class for frontend devices, providing common functionality.
Definition FrontEndBase.h:18
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
void setPollTimeout(int value)
Sets the timeout for polling in seconds. Timeout starts counting after the polling exceeds initial es...
Definition RMMRing.cpp:447
rmmStatus setEnabled(bool enable)
Sets the software-level enabled status of the ring.
Definition RMMRing.cpp:71
RMMLog log_
Log handler for RMMRing messages.
Definition RMMRing.h:68
FrontEndBase * getFEN(int node)
Retrieves a pointer to a specific Front-End Node by its index.
Definition RMMRing.cpp:44
ringStatus check()
Check whether the ring is correctly locked.
Definition RMMRing.cpp:99
rmmStatus tearDown(bool waitTime=true)
Teardown a specific ring.
Definition RMMRing.cpp:126
void addEntry(std::shared_ptr< FrontEndBase > fen)
Adds a Front-End Node (FEN) entry to the ring's topology.
Definition RMMRing.cpp:19
rmmStatus startSendingBulkData()
Inform all FEs in the ring that they can start sending bulk data.
Definition RMMRing.cpp:452
int getPollTimeout()
Gets the timeout for polling in seconds.
Definition RMMRing.cpp:439
bool isOperational() const
Check the ring's operational status.
Definition RMMRing.h:64
void setLogMask(int mask)
Set the log mask for this ring.
Definition RMMRing.cpp:88
uint32_t getNumberOfFENs() const
Retrieves the total number of Front-End Nodes registered in this ring.
Definition RMMRing.cpp:28
RingState getStatus() const
Retrieves the current state of the ring.
Definition RMMRing.cpp:57
RMMRing(uint32_t ringId, RMMRegisterAccess &regs, std::mutex *beMutex=nullptr)
Constructor for the RMMRing object.
Definition RMMRing.cpp:5
rmmStatus bringup()
Brings up a ring.
Definition RMMRing.cpp:226
Struct to represent the result of an RMM register operation.
Definition RMMRegisterAccess.h:37
Represents the current operational status and topology information of a ring.
Definition RMMRing.h:27
uint32_t nodeCount
Definition RMMRing.h:30
bool enabled
Definition RMMRing.h:28
bool inTopology
Definition RMMRing.h:29