diff --git a/src/datachunk.cpp b/src/datachunk.cpp new file mode 100644 --- /dev/null +++ b/src/datachunk.cpp @@ -0,0 +1,130 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + serialplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with serialplot. If not, see . +*/ + +#include + +#include "datachunk.h" + +DataChunk::DataChunk(size_t start, size_t capacity) +{ + _start = start; + _capacity = capacity; + _size = 0; + _samples = new double[capacity]; + + _min = 0; + _max = 0; + _sum = 0; + _sumSquare = 0; +} + +DataChunk::~DataChunk() +{ + delete[] _samples; +} + +size_t DataChunk::start() const +{ + return _start; +} + +size_t DataChunk::end() const +{ + return _start + _size; +} + +bool DataChunk::isFull() const +{ + return left() == 0; +} + +size_t DataChunk::size() const +{ + return _size; +} + +size_t DataChunk::capacity() const +{ + return _capacity; +} + +size_t DataChunk::left() const +{ + return _capacity - _size; +} + +double DataChunk::min() const +{ + return _min; +} + +double DataChunk::max() const +{ + return _max; +} + +double DataChunk::avg() const +{ + return _sum / _size; +} + +double DataChunk::meanSquare() const +{ + return _sumSquare / _size; +} + +double DataChunk::sample(size_t i) const +{ + Q_ASSERT(i <= _size); + return _samples[i]; +} + +void DataChunk::addSamples(double* samples, size_t size) +{ + Q_ASSERT(size > 0 && size <= left()); + + // start min&max values from first sample + if (_size == 0) + { + _min = _max = samples[0]; + } + + for (unsigned i = 0; i < size; i++) + { + double newSample = samples[i]; + + _samples[this->_size + i] = newSample; + + // update min/max and measurements + if (newSample < _min) + { + _min = newSample; + } + else if (newSample > _max) + { + _max = newSample; + } + _sum += newSample; + _sumSquare += newSample * newSample; + } + + this->_size += size; + + Q_ASSERT(this->_size <= this->_capacity); +}