diff options
author | Arseniy-Movshev <dodoradio@outlook.com> | 2023-05-29 12:52:52 +0100 |
---|---|---|
committer | Arseniy-Movshev <dodoradio@outlook.com> | 2023-05-30 00:28:07 +0100 |
commit | 0d5a7b23b192194833d80540cac8c361f3de24ec (patch) | |
tree | 5421a0c2392658a978d34128bb550cad513e89dd | |
parent | fd718937e22c22e716a951e2bb58ac1bc624f70e (diff) |
Add heartrate graph
-rw-r--r-- | qmlplugin/CMakeLists.txt | 4 | ||||
-rw-r--r-- | qmlplugin/hrGraph.cpp | 102 | ||||
-rw-r--r-- | qmlplugin/hrGraph.h | 73 | ||||
-rw-r--r-- | qmlplugin/sensorlogdqmlplugin.cpp | 2 |
4 files changed, 180 insertions, 1 deletions
diff --git a/qmlplugin/CMakeLists.txt b/qmlplugin/CMakeLists.txt index 9455067..62dbef5 100644 --- a/qmlplugin/CMakeLists.txt +++ b/qmlplugin/CMakeLists.txt @@ -6,10 +6,12 @@ add_library( stepsDataLoader.h loggerSettings.cpp loggerSettings.h + hrGraph.cpp + hrGraph.h ) target_link_libraries(sensorlogdqmlplugin - Qt5::Qml Qt5::DBus + Qt5::Qml Qt5::Quick Qt5::DBus ) install(TARGETS sensorlogdqmlplugin 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(); +} diff --git a/qmlplugin/hrGraph.h b/qmlplugin/hrGraph.h new file mode 100644 index 0000000..3e25311 --- /dev/null +++ b/qmlplugin/hrGraph.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 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. + */ + +#ifndef HRGRAPH_H +#define HRGRAPH_H + +#include <QQuickPaintedItem> +#include <QPixmap> +#include <QDateTime> +#include <QVector> + +class HrGraph : public QQuickPaintedItem +{ + Q_OBJECT + + // Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + // Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) + + struct HrDatapoint { + qint64 time; + int value; + }; + +public: + HrGraph(); + void paint(QPainter *painter) override; + +signals: + void loadingDone(); + +private: + void updateBasePixmap(); + void loadGraphData(QDate date = QDate::currentDate()); + + float m_size; + QString m_name; + QColor m_color; + QPixmap m_pixmap; + QList<HrDatapoint> m_filedata; + bool m_fileLoadStatus; + int minHrValue = 0; + int maxHrValue = 0; + int minTime; + int maxTime; +}; + +#endif // ICON_H diff --git a/qmlplugin/sensorlogdqmlplugin.cpp b/qmlplugin/sensorlogdqmlplugin.cpp index d52812c..94d4e01 100644 --- a/qmlplugin/sensorlogdqmlplugin.cpp +++ b/qmlplugin/sensorlogdqmlplugin.cpp @@ -13,6 +13,7 @@ #include <QtQml> #include "stepsDataLoader.h" #include "loggerSettings.h" +#include "hrGraph.h" LogdPlugin::LogdPlugin(QObject *parent) : QQmlExtensionPlugin(parent) { @@ -23,5 +24,6 @@ void LogdPlugin::registerTypes(const char *uri) Q_ASSERT(uri == QLatin1String("org.asteroid.sensorlogd")); qmlRegisterType<StepsDataLoader>(uri, 1, 0, "StepsDataLoader"); qmlRegisterType<LoggerSettings>(uri, 1, 0, "LoggerSettings"); + qmlRegisterType<HrGraph>(uri, 1, 0, "HeartrateGraph"); } |