Program Listing for File tohost_monitor.hpp
↰ Return to documentation for file (tohost_monitor.hpp
)
#ifndef FELIX_TOHOST_MONITOR_H_
#define FELIX_TOHOST_MONITOR_H_
#include "monitor.hpp"
enum ChunkStatus {
FW_TRUNC = 1, SW_TRUNC = 2, FW_MALF = 4, FW_CRC = 8, SW_MALF = 16
};
struct ToHostDeviceStats
{
int device_id;
explicit ToHostDeviceStats(int d)
: device_id(d) {};
};
struct ToHostDmaStats
{
int dmaid;
uint32_t dma_free_MB;
uint64_t irq_count;
explicit ToHostDmaStats(int dm, int mb, uint64_t irq)
: dmaid(dm), dma_free_MB(mb), irq_count(irq) {};
};
struct ToHostReaderStats
{
int reader_id;
int type;
uint32_t number_of_subscriptions;
uint32_t number_of_network_resources;
uint64_t number_of_network_resource_calls;
explicit ToHostReaderStats(int ri, int t, uint32_t s, uint32_t r, uint64_t c) :
reader_id(ri),
type(t),
number_of_subscriptions(s),
number_of_network_resources(r),
number_of_network_resource_calls(c) {};
};
struct ToHostElinkStats
{
uint64_t fid = 0;
uint64_t processed_blocks = 0;
uint64_t processed_chunks = 0;
uint64_t processed_bytes = 0;
float rate_chunks_kHz = 0;
uint64_t dropped_blocks = 0;
uint32_t largest_chunk_size = 0;
uint32_t average_chunk_bytes = 0;
uint64_t sw_trunc_chunks = 0;
uint64_t fw_trunc_chunks = 0;
uint64_t sw_error_chunks = 0;
uint64_t fw_error_chunks = 0;
uint64_t fw_crc_chunks = 0;
uint64_t oosequence_l0id = 0;
struct timespec ts;
void increment_processed_blocks(){++processed_blocks;}
void increment_dropped_blocks(){++dropped_blocks;}
void increment_oosequence_l0id(){++oosequence_l0id;}
void update_processed_chunk(uint8_t e, uint32_t s);
ToHostElinkStats get_increment(ToHostElinkStats & stats);
ToHostElinkStats() = default;
explicit ToHostElinkStats(uint64_t f) : fid(f), processed_blocks(0), processed_chunks(0),
processed_bytes(0), rate_chunks_kHz(0),
dropped_blocks(0),largest_chunk_size(0), sw_trunc_chunks(0), fw_trunc_chunks(0),
sw_error_chunks(0), fw_error_chunks(0), fw_crc_chunks(0), oosequence_l0id(0)
{
clock_gettime(CLOCK_MONOTONIC_RAW , &ts);
};
};
class ToHostMonitor : public Monitor
{
public:
explicit ToHostMonitor(std::string& fifoname) : Monitor(fifoname) {
m_message = nlohmann::json::array();
}
//These functions are called in a nested loop with hierarchy
//devices > dmas > readers > elinks.
void append_device_stats(const std::string& ts, const std::string& hostname, const ToHostDeviceStats & s);
void append_dma_stats(const std::string& ts, const std::string& hostname, int deviceid, const ToHostDmaStats & s);
void append_reader_stats(const std::string& ts, const std::string& hostname, int deviceid, int dma_id, const ToHostReaderStats & s);
void append_elink_stats(const std::string& ts, const std::string& hostname, int device, int dma_id, int reader_id, const ToHostElinkStats & s);
};
#endif /* FELIX_TOHOST_MONITOR_H_ */