#include "gtl_math_analog_value.h" #include #include namespace gtl { namespace math { analog_value::analog_value(gtl::analog_data *data) : QObject{/*data*/NULL} , _avg_cnt(1) , _value(0) , _ad(data) , _is_acq(true) { set_time(0.1); connect(_ad, >l::analog_data::data_changed, this, &analog_value::data_changed); } analog_value::~analog_value() { } QString analog_value::name() const { return _name; } qreal analog_value::value() const { return _value; } qreal analog_value::time() const { return _time; } quint32 analog_value::avg_cnt() const { return _avg_cnt; } qreal analog_value::avg_value() const { if(_values.empty()) return 0; return std::accumulate(_values.begin(), _values.end(), 0.0)/_values.size(); } QList analog_value::values() const { return _values; } void analog_value::set_time(qreal value) { if(value != _time) { _ad->lock_device(); _time = value; _data.resize(qRound(_time * _ad->get_rate())); std::fill(_data.begin(), _data.end(), 0.0); _data_ptr = 0; _value = 0; _values.clear(); _ad->unlock_device(); emit time_changed(); } } void analog_value::set_avg_cnt(quint32 value) { if(value != _avg_cnt) { _avg_cnt = value; emit avg_cnt_changed(); } } void analog_value::stop_acq() { _is_acq = false; } void analog_value::before_copying_data(std::vector::iterator begin, std::vector::iterator end) { } void analog_value::after_copying_data(std::vector::iterator begin, std::vector::iterator end) { } void analog_value::set_name(QString value) { if(_name != value) { _name = value; emit name_changed(); } } void analog_value::data_changed() { if(!_is_acq) return; _ad->lock_device(); int idx = /*std::max(0, (int)_ad->size() - (int)_data.size())*/0; while(idx != _ad->size()) { int size = std::min((int)_ad->size() - idx, (int)_data.size() - _data_ptr); std::vector::iterator begin = _data.begin() + _data_ptr; std::vector::iterator end = begin + size; before_copying_data(begin, end); std::copy(_ad->begin() + idx, _ad->begin() + idx + size, begin); after_copying_data(begin, end); if(end == _data.end()) { _values.push_back(value()); while(_values.size() > _avg_cnt) _values.pop_front(); } _data_ptr = (_data_ptr + size) % _data.size(); idx += size; } _ad->unlock_device(); } } }