From d5f695da5c7fd112d72e0df3f2ec72371c3d3adc Mon Sep 17 00:00:00 2001 From: Arseniy Movshev Date: Fri, 2 Jun 2023 00:31:50 +0100 Subject: Add heartrate graph (experimental, slightly broken) --- src/graphs/HrGraph.qml | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.qml | 14 ++++++ 2 files changed, 136 insertions(+) create mode 100644 src/graphs/HrGraph.qml diff --git a/src/graphs/HrGraph.qml b/src/graphs/HrGraph.qml new file mode 100644 index 0000000..5a2be8b --- /dev/null +++ b/src/graphs/HrGraph.qml @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2023 Arseniy Movshev + * 2019 Florent Revest + * + * This program 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. + * + * This program 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 this program. If not, see . + */ + +import QtQuick 2.15 +import org.asteroid.controls 1.0 + +import org.asteroid.sensorlogd 1.0 + +Item { + id: graph + width: parent.width*0.9 + anchors.horizontalCenter: parent.horizontalCenter + property var labelsArr: [] + property var valueDivisionsInterval: 0 + property var valueDivisionsCount: 0 + property var startValueDivision: 0 + property real valuesDelta: hrGraph.relativeMode ? hrGraph.maxValue - hrGraph.minValue : hrGraph.maxValue + + property var timeDivisionsCount: 0 + property var timeDivisionsInterval: 0 + property var startTimeDivision: 0 + property var timeDelta: 0 + property var minTimeSeconds: 0 + + function dataLoadingDone() { + labelsRepeater.model = labelsArr.length + } + Component.onCompleted: { // I am so so sorry about this code. + loadGraphData(hrDataLoader.getTodayData()) + console.log("minValue", hrGraph.minValue, "maxValue",hrGraph.maxValue) + //values divisions + valueDivisionsInterval = (valuesDelta) >= 50 ? 10 : 5 + valueDivisionsCount = hrGraph.relativeMode ? (Math.ceil(hrGraph.maxValue/valueDivisionsInterval)) - (Math.ceil(hrGraph.minValue/valueDivisionsInterval)) : Math.ceil(hrGraph.maxValue/valueDivisionsInterval) + 1 + startValueDivision = hrGraph.relativeMode ? Math.ceil(hrGraph.minValue/valueDivisionsInterval)*valueDivisionsInterval : 0 + //times divisions + var timeDelta = dateToDaySecs(hrGraph.maxTime) - dateToDaySecs(hrGraph.minTime) + timeDivisionsCount = Math.floor(timeDelta/3600) // get number of hours and divide + timeDivisionsInterval = timeDivisionsCount > 11 ? 4 : 2 + timeDivisionsCount = timeDivisionsCount/timeDivisionsInterval + startTimeDivision = hrGraph.minTime.getHours() + 1 + minTimeSeconds = dateToDaySecs(hrGraph.minTime) + timeDelta = dateToDaySecs(hrGraph.maxTime) - minTimeSeconds + labelsRepeater.model = graph.timeDivisionsCount + + } + HrDataLoader { id: hrDataLoader } + Item { // labels column + id: markerParent + width: parent.width/8 + height: parent.height + anchors { + left: parent.left + top: hrGraph.top + bottom: hrGraph.bottom + } + Repeater { + model: graph.valueDivisionsCount + delegate: Label { + anchors.right: parent.right + property real value: graph.startValueDivision + graph.valueDivisionsInterval*index + text: value + font.pixelSize: Dims.w(5) + y: parent.height /*- height/2*/ - (parent.height /*- hrGraph.lineWidth*2*/)*(value/graph.valuesDelta) /*+ hrGraph.lineWidth*/ + verticalAlignment: Text.AlignVCenter + } + } + } + HeartrateGraph { + id: hrGraph + anchors { + left: markerParent.right + right: parent.right + top: parent.top + bottom: labelsRow.top + } + relativeMode: false + lineWidth: 4 + } + Row { //labels row + id: labelsRow + height: Dims.w(5) + anchors { + bottom: parent.bottom + left: hrGraph.left + right: hrGraph.right + // leftMargin: + } + Repeater { + id: labelsRepeater + model: 0 + delegate: Label { + width: graph.width/8 + id: dowLabel + // anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + property var value: graph.startTimeDivision + index*graph.timeDivisionsInterval + text: value + ":00" + x: ((value*3600-graph.minTimeSeconds)/graph.timeDelta)*parent.width + onValueChanged: console.log("value",value,"x",x,"text",text) + font.pixelSize: Dims.w(5) + } + } + } + function dateToDaySecs(date) { + return (date.getHours()*3600 + date.getMinutes()*60 + date.getSeconds()) + } +} diff --git a/src/main.qml b/src/main.qml index 153dac4..bcbb71d 100644 --- a/src/main.qml +++ b/src/main.qml @@ -110,6 +110,20 @@ Application { } Item { width: parent.width; height: parent.width*0.1} + Label { + anchors { + left: parent.left + margins: app.width*0.1 + } + text: "Heartrate" + } + + HrGraph { + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width*0.9 + height: app.height*2/3 + } + ListItem { title: "Settings" iconName: "ios-settings-outline" -- cgit v1.2.3-70-g09d2