diff options
Diffstat (limited to '')
-rw-r--r-- | qmlplugin/hrGraph.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/qmlplugin/hrGraph.cpp b/qmlplugin/hrGraph.cpp new file mode 100644 index 0000000..7540083 --- /dev/null +++ b/qmlplugin/hrGraph.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2023 Arseniy Movshev <dodoradio@outlook.com> + * 2017 Florent Revest <revestflo@gmail.com> + * All rights reserved. + * + * You may use this file under the terms of BSD license as follows: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the author nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "hrGraph.h" +#include "stepsDataLoader.h" + +#include <QPainter> +#include <QDate> +#include <QFile> +#include <QVector> +#include <QSettings> +#include <QStandardPaths> + +HrGraph::HrGraph() +{ + setFlag(ItemHasContents, true); + setRenderTarget(QQuickPaintedItem::FramebufferObject); + loadGraphData(); +} + +void HrGraph::paint(QPainter *painter) +{ + if (!m_fileLoadStatus) { + return; + } + int j = m_filedata.count(); + QPointF points[j]; + float valueDelta = maxHrValue - minHrValue; + float timeDelta = maxTime - minTime; + float calculatedValue = 0; + float calculatedTimeSeconds = 0; + for(int i = 0; i < j; i++) { + calculatedTimeSeconds = (m_filedata.at(i).time - minTime)/timeDelta; + calculatedValue = 1 - (m_filedata.at(i).value - minHrValue)/valueDelta; + points[i] = QPointF(1 + calculatedTimeSeconds*(height()-2), 1 + calculatedValue*(width()-2)); //these +2 -1 are here to make sure that the graph fits within the drawn area, as it will be clipped by qt if it doesn't. + } + painter->drawPolyline(points,j); +} + +void HrGraph::loadGraphData(QDate date) { + m_fileLoadStatus = false; + QFile file(fileNameForDate(date, "heartrateSensor")); + if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { + qDebug() << "failed to open file"; + return; + } + m_fileLoadStatus = true; + QTextStream inStream(&file); + QString line; + int i = 0; + int currTime; + int currValue; + m_filedata.clear(); + while(!inStream.atEnd()) + { + line = inStream.readLine(); + currTime = line.split(":")[0].toInt(); + currValue = line.split(":")[1].toInt(); + HrDatapoint datapoint; + datapoint.time = currTime; + datapoint.value = currValue; + m_filedata.append(datapoint); + if(i == 0) { + minTime = currTime; + maxHrValue = currValue; + minHrValue = currValue; + } + if(currValue > maxHrValue) { maxHrValue = currValue; } + if(currValue < minHrValue) { minHrValue = currValue; } + i++; + } + maxTime = currTime; + qDebug() << "heartrate graph file loading done"; + file.close(); +} |