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

130 lines
5.9 KiB
C++
Raw Permalink Normal View History

2024-06-07 11:12:56 +03:00
/*
* 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_ */