130 lines
5.9 KiB
C++
130 lines
5.9 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_ */
|