From 0d5a7b23b192194833d80540cac8c361f3de24ec Mon Sep 17 00:00:00 2001 From: Arseniy-Movshev Date: Mon, 29 May 2023 12:52:52 +0100 Subject: Add heartrate graph --- qmlplugin/CMakeLists.txt | 4 +- qmlplugin/hrGraph.cpp | 102 ++++++++++++++++++++++++++++++++++++++ qmlplugin/hrGraph.h | 73 +++++++++++++++++++++++++++ qmlplugin/sensorlogdqmlplugin.cpp | 2 + 4 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 qmlplugin/hrGraph.cpp create mode 100644 qmlplugin/hrGraph.h 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 + * 2017 Florent Revest + * 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 +#include +#include +#include +#include +#include + +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 + * 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 +#include +#include +#include + +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 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 #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(uri, 1, 0, "StepsDataLoader"); qmlRegisterType(uri, 1, 0, "LoggerSettings"); + qmlRegisterType(uri, 1, 0, "HeartrateGraph"); } -- cgit v1.2.3-54-g00ecf