130 lines
4.4 KiB
C++
130 lines
4.4 KiB
C++
/*
|
|
* Osciloscope.h
|
|
*
|
|
* Created on: 14 íîÿá. 2016 ã.
|
|
* Author: titov
|
|
*/
|
|
|
|
#ifndef SOURCE_SYSTEM_OSCILOSCOPE_H_
|
|
#define SOURCE_SYSTEM_OSCILOSCOPE_H_
|
|
|
|
#include "../peripheral/IMemoryAccess.hh"
|
|
#include "../systemic/ISignal.hh"
|
|
|
|
namespace driver {
|
|
|
|
//! Êëàññ îñöëîãðàôèðîâàíèÿ ïàðàìåòðîâ.
|
|
class Osciloscope {
|
|
public:
|
|
static const unsigned int max_num_parameter = 10u; //!< Ìàêñèìàëüíîå ÷èñëî îñöèëîãðàôèðóåìûõ ïàðàìåòðîâ.
|
|
|
|
//! Óñëîâèå ñðàáàòûâàíèÿ òðèããåðà.
|
|
enum TriggerCondition : int {
|
|
LessEqual = 0,
|
|
GreatEqual = 1,
|
|
Equal = 2,
|
|
};
|
|
|
|
//! Ñòðóêòóðà îïèñûâàåò íàñòðîéêè äëÿ êîíôèãóðèðîâàíèÿ îñöëîãðàôà.
|
|
struct Configuration {
|
|
unsigned int num_parameter; //!< ×èñëî îñöèëîãðàôèðóåìûõ ïàðàìåòðîâ.
|
|
const systemic::ISignal * parameter[max_num_parameter]; //!< Ìàññèâ óêàçàòåëåé íà îñöèëîãðàôèðóåìûå ïàðàìåòðû.
|
|
|
|
const systemic::ISignal * trigger; //!< Óêàçàòåëü ñèãíàëà òðèããåðà.
|
|
int condition; //!< Óñëîâèå ñðàáàòûâàíèÿ òðèããåðà.
|
|
float threshold; //!< Óðîâåíü ñðàáàòûâàíèÿ òðèããåðà.
|
|
|
|
float after_trigger_percent; //!< Êîëè÷åñòâî èçìåðåíèé ïîñëå òðèããåðà.
|
|
float measurement_period; //!< Ïåðèîä èçìåðåíèé, â ñåêóíäàõ.
|
|
};
|
|
|
|
//! Ñòðóêòóðà îïèñûâàåò ñîñòîÿíèå îñöèëîãðàôà.
|
|
struct State {
|
|
std::size_t num_measurement; //!< Êîëè÷åñòâî èçìåðåíèé
|
|
std::size_t num_parameter; //!< Êîëè÷åñòâî èçìåðÿåìûõ ñèãíàëîâ
|
|
std::size_t measurements_after_trigger; //!< Êîëè÷åñòâî èçìåðåíèé ïîñëå ñðàáàòûâàíèÿ òðèãåðà
|
|
float measurement_period; //!< Äèñêðåòíîñòü èçìåðåíèÿ ñèãíàëà
|
|
|
|
bool measurement_active; //!< Ïðèçíàê àêòèâíîñòè èçìåðåíèé.
|
|
bool trigger_active; //!< Ïðèçíàê àêòèâíîñòè òðèããåðà.
|
|
};
|
|
|
|
Osciloscope( peripheral::IMemoryAccess & rf_memory );
|
|
virtual ~Osciloscope() = default;
|
|
|
|
//! Ôóíêöèÿ êîíôèãóðèðîâàíèÿ îñöèëîãðàôà.
|
|
//! \return ðåçóëüòàò êîíôèãóðèðîâàíèÿ, â ñëó÷àå false êîíôèãóðàöèÿ íå âàëèäíà.
|
|
bool configurate( const Configuration & );
|
|
|
|
//! Ôóíêöèÿ çàïðîñ ñîñòîÿíèÿ îñöèëîãðàôà.
|
|
State getState() const;
|
|
|
|
//! Ïðèçíàê ãîòîâíîñòè äàííûõ.
|
|
bool isDataReady() const;
|
|
|
|
//! Ôóíêöèÿ ïîëó÷åíèÿ èçìåðåíèÿ ïî èä ñèãíàëà.
|
|
//! \param[in] id Èäåíòèôèêàòîð ñèãíàëà.
|
|
//! \param[in] index Íîìåð èçìåðåíèÿ.
|
|
//! \return Èçìåðåíèå ëèáî NAN.
|
|
float getMeasurement( unsigned int id, unsigned long index ) const;
|
|
|
|
//! Çàïóñê îñöëîãðàôà ñ òåêóùèìè íàñòðîéêàìè.
|
|
void start();
|
|
|
|
//! Îñòàíîâêà îñöèëîãðàôèðâàíèÿ.
|
|
void stop();
|
|
|
|
void setSampleTime( float ts_in_second );
|
|
void process();
|
|
|
|
private:
|
|
typedef float value_type; //!<Òèï äàííûõ ïàðàìåòðîâ îñöèëëîãðàôèðîâàíèÿ.
|
|
static const std::size_t value_size = sizeof(value_type); //!<Ðàçìåð òèïà äàííûõ îñöèëëîãðàôèðîâàíèÿ.
|
|
|
|
//!Ïðîâåðêà âàëèäíîñòè âõîäÿùèõ ïàðàìåòðîâ îñöèëëîãðàôèðîâàíèÿ.
|
|
bool income_parameters_valid( const Configuration & );
|
|
|
|
template<typename T>
|
|
bool parameter_in_bound( T, T, T ) const;
|
|
|
|
void parameters_registration();
|
|
private:
|
|
//! Äîñòóï ê ïàìÿòè.
|
|
peripheral::IMemoryAccess & memory;
|
|
|
|
const std::size_t data_length = 0; //!< Îáùåå êîëè÷åñòâî ñîõðàíÿåìûõ äàííûõ.
|
|
|
|
value_type threshold = 0.0f; //!< Óðîâåíü ñðàáàòûâàíèÿ òðèããåðà.
|
|
float sample_time = 0.0f; //!< Ïåðèîä êâàíòîâàíèÿ èçìåðåíèé.
|
|
|
|
std::size_t num_parameter = 0; //!< ×èñëî îñöèëîãðàôèðóåìûõ ïàðàìåòðîâ.
|
|
std::size_t sample_cnt = 0; //!< Ñ÷åò÷èê ñåìïëîâ.
|
|
std::size_t save_sample_period = 0; //!< Ïåðèîä ñîõðàíåíèÿ ñèãíàëîâ â ñåìïëàõ.
|
|
std::size_t measurement_after_trigger = 0; //!< Êîëè÷åñòâî èçìåðåíèé ïîñëå òðèããåðà
|
|
std::size_t cnt_after_trigger = 0; //!< Ñ÷åò÷èê êîëè÷åñòâà èçìåðåíèé ïîñëå òðèããåðà.
|
|
std::size_t measurement_index = 0; //!< Èíäåêñ òåêóùåãî îòñ÷åòà.
|
|
std::size_t measurement_num = 0; //!< Îáùåå êîëè÷åñòâî èçìåðåíèé.
|
|
std::size_t start_measurement_index = 0; //!< Èíäåêñ èçìåðåíèÿ â ìîìåíò ñðàáàòûâàíèÿ òðèããåðà.
|
|
|
|
TriggerCondition condition = LessEqual; //!< Óñëîâèå ñðàáàòûâàíèÿ òðèããåðà.
|
|
|
|
bool triggered = false; //!< Ïðèçíàê àêòèâíîñòè òðèããåðà.
|
|
bool measurement_active = false; //!< Ïðèçíàê àêòèâíîñòè èçìåðåíèé.
|
|
bool flyover_bound = false; //!<Ïðèçíàê ïåðåõîäà ÷åðåç ïðàâóþ ãðàíèöó ïàìÿòè.
|
|
bool configured = false; //!<Ïðèçíàê òîãî, ÷òî îñöèëëîãðàô áûë ñïàðàìåòðèðîâàí.
|
|
|
|
const systemic::ISignal * parameter[max_num_parameter]; //!< Ìàññèâ óêàçàòåëåé íà îñöèëîãðàôèðóåìûå ïàðàìåòðû.
|
|
const systemic::ISignal * trigger = 0; //!< Óêàçàòåëü ñèãíàëà òðèããåðà.
|
|
|
|
Osciloscope & operator=(const Osciloscope &) = delete;
|
|
Osciloscope(Osciloscope &) = delete;
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* SOURCE_SYSTEM_OSCILOSCOPE_H_ */
|