From d5f695da5c7fd112d72e0df3f2ec72371c3d3adc Mon Sep 17 00:00:00 2001
From: Arseniy Movshev <dodoradio@outlook.com>
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 <dodoradio@outlook.com>
+ *               2019 Florent Revest <revestflo@gmail.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+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