From 0f6d18eaca0a359a7e9a70aba8f00a22af71eee2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Sep 2017 15:29:40 -0400 Subject: [PATCH] add analysis_thread --- src/zm_analysis_thread.cpp | 44 ++++++++++++++++++++++++++++++++++++++ src/zm_analysis_thread.h | 29 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/zm_analysis_thread.cpp create mode 100644 src/zm_analysis_thread.h diff --git a/src/zm_analysis_thread.cpp b/src/zm_analysis_thread.cpp new file mode 100644 index 000000000..48a2a815c --- /dev/null +++ b/src/zm_analysis_thread.cpp @@ -0,0 +1,44 @@ +#include "zm_analysis_thread.h" + + +AnalysisThread::AnalysisThread( Monitor *p_monitor ) { + monitor = p_monitor; + terminate = false; + sigemptyset( &block_set ); +} + +AnalysisThread::~AnalysisThread() { +} + +int AnalysisThread::run() { + + useconds_t analysis_rate = monitor->GetAnalysisRate(); + unsigned int analysis_update_delay = monitor->GetAnalysisUpdateDelay(); + time_t last_analysis_update_time, cur_time; + monitor->UpdateAdaptiveSkip(); + last_analysis_update_time = time( 0 ); + + while( !terminate ) { + // Process the next image + sigprocmask( SIG_BLOCK, &block_set, 0 ); + + // Some periodic updates are required for variable capturing framerate + if ( analysis_update_delay ) { + cur_time = time( 0 ); + if ( (unsigned int)( cur_time - last_analysis_update_time ) > analysis_update_delay ) { + analysis_rate = monitor->GetAnalysisRate(); + monitor->UpdateAdaptiveSkip(); + last_analysis_update_time = cur_time; + } + } + + if ( !monitor->Analyse() ) { + usleep( monitor->Active()?ZM_SAMPLE_RATE:ZM_SUSPENDED_RATE ); + } else if ( analysis_rate ) { + usleep( analysis_rate ); + } + + sigprocmask( SIG_UNBLOCK, &block_set, 0 ); + } + return 0; +} // end in AnalysisThread::run() diff --git a/src/zm_analysis_thread.h b/src/zm_analysis_thread.h new file mode 100644 index 000000000..33a4fb7f4 --- /dev/null +++ b/src/zm_analysis_thread.h @@ -0,0 +1,29 @@ +#ifndef ZM_ANALYSIS_THREAD_H +#define ZM_ANALYSIS_THREAD_H + +#include "zm_thread.h" +#include + +#include "zm_monitor.h" + +class AnalysisThread : public Thread { + private: + bool terminate; + sigset_t block_set; + Monitor *monitor; + + public: + AnalysisThread( Monitor * ); + ~AnalysisThread(); + int run(); + + void stop() { + terminate = true; + } + bool stopped() const { + return( terminate ); + } + +}; + +#endif