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