MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/Osciloscope.hh
2024-06-07 11:12:56 +03:00

130 lines
5.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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