MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/Osciloscope.hh

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_ */