From c3593636622c6d90b412216f6653369b50e9f00e Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Thu, 24 Sep 2020 09:39:26 +0200 Subject: [PATCH] FrameStatistics class --- sf-buffer-recv/include/FrameStats.hpp | 27 +++++++++++++++ sf-buffer-recv/src/FrameStats.cpp | 49 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 sf-buffer-recv/include/FrameStats.hpp create mode 100644 sf-buffer-recv/src/FrameStats.cpp diff --git a/sf-buffer-recv/include/FrameStats.hpp b/sf-buffer-recv/include/FrameStats.hpp new file mode 100644 index 0000000..9d6fa71 --- /dev/null +++ b/sf-buffer-recv/include/FrameStats.hpp @@ -0,0 +1,27 @@ +#include +#include +#include + +#ifndef SF_DAQ_BUFFER_FRAMESTATS_HPP +#define SF_DAQ_BUFFER_FRAMESTATS_HPP + + +class FrameStats { + const std::string source_name_; + size_t stats_modulo_; + + int frames_counter_; + int n_missed_packets_; + int n_corrupted_frames_; + std::chrono::time_point stats_interval_start_; + + void reset_counters(); + void print_stats(); + +public: + FrameStats(const std::string &source_name, const size_t stats_modulo); + void record_stats(const ModuleFrame &meta); +}; + + +#endif //SF_DAQ_BUFFER_FRAMESTATS_HPP diff --git a/sf-buffer-recv/src/FrameStats.cpp b/sf-buffer-recv/src/FrameStats.cpp new file mode 100644 index 0000000..ded7649 --- /dev/null +++ b/sf-buffer-recv/src/FrameStats.cpp @@ -0,0 +1,49 @@ +#include +#include "FrameStats.hpp" + +using namespace std; +using namespace chrono; + +FrameStats::FrameStats(const string& source_name, const size_t stats_modulo) : + source_name_(source_name), + stats_modulo_(stats_modulo) +{ + reset_counters(); +} + +void FrameStats::reset_counters() +{ + frames_counter_ = 0; + n_missed_packets_ = 0; + n_corrupted_frames_ = 0; + stats_interval_start_ = steady_clock::now(); +} + +void FrameStats::record_stats(const ModuleFrame &meta) +{ + if (meta.n_recv_packets < JF_N_PACKETS_PER_FRAME) { + n_missed_packets_ += JF_N_PACKETS_PER_FRAME - meta.n_recv_packets; + n_corrupted_frames_++; + } + + frames_counter_++; + + if (frames_counter_ == stats_modulo_) { + print_stats(); + reset_counters(); + } +} + +void FrameStats::print_stats() +{ + auto interval_ms_duration = duration_cast( + stats_interval_start_-steady_clock::now()).count(); + // * 1000 because milliseconds, 0.5 for truncation. + int rep_rate = ((frames_counter_/interval_ms_duration) * 1000) + 0.5; + + cout << "sf_buffer:device_name " << source_name_; + cout << " sf_buffer:n_missed_packets " << n_missed_packets_; + cout << " sf_buffer:n_corrupted_frames " << n_corrupted_frames_; + cout << " sf_buffer:repetition_rate " << rep_rate; + cout << endl; +}