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