summaryrefslogtreecommitdiff
path: root/src/graphs/HrGraph.qml
blob: 84a408efb967831465b6bd6321bfd4f645f94d57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * 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.health 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.
        console.log(typeof hrDataLoader.getTodayData())
        hrGraph.loadGraphData(hrDataLoader.getTodayData())
        console.log("minValue", hrGraph.minValue, "maxValue",hrGraph.maxValue)
        //values divisions
        valueDivisionsInterval = valuesDelta >= 50 ? (valuesDelta >= 100 ? 20: 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
        minTimeSeconds = dateToDaySecs(hrGraph.minTime)
        timeDelta = dateToDaySecs(hrGraph.maxTime) - minTimeSeconds
        timeDivisionsCount = Math.floor(timeDelta/3600) // get number of hours and divide
        timeDivisionsInterval = timeDivisionsCount > 11 ? 4 : 2
        timeDivisionsCount = timeDivisionsCount/timeDivisionsInterval
        startTimeDivision = hrGraph.minTime.getHours() + 1
        labelsRepeater.model = graph.timeDivisionsCount
    }
    HrDataLoader { id: hrDataLoader }
    Item { // labels column
        id: markerParent
        width: parent.width/8
        anchors {
            left: parent.left
            top: hrGraph.top
            bottom: hrGraph.bottom
            topMargin: hrGraph.lineWidth/2
            bottomMargin: anchors.topMargin
        }
        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 - (parent.height)*(value/graph.valuesDelta) - height/2
                verticalAlignment: Text.AlignVCenter
            }
        }
    }
    HeartrateGraph {
        id: hrGraph
        anchors {
            left: markerParent.right
            right: parent.right
            top: parent.top
            bottom: labelsRow.top
        }
        relativeMode: false
        lineWidth: 4
    }
    Item { //labels row
        id: labelsRow
        height: Dims.w(5)
        anchors {
            bottom: parent.bottom
            left: hrGraph.left
            right: hrGraph.right
            rightMargin: hrGraph.lineWidth/2
            leftMargin: anchors.rightMargin
        }
        Repeater {
            id: labelsRepeater
            model: 0
            delegate: Label {
                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, "mintimeseconds", graph.minTimeSeconds, "timeDelta", graph.timeDelta,"x",x,"text",text)
                font.pixelSize: Dims.w(5)
            }
        }
    }
    function dateToDaySecs(date) {
        return (date.getHours()*3600 + date.getMinutes()*60 + date.getSeconds())
    }
}