Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
3 Schweinehunde
Encrateia
Commits
aaf964fa
Commit
aaf964fa
authored
May 05, 2020
by
Stefan Haslinger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
heart rate zones in activity heart rate diagram
parent
7ca6c8ad
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
133 additions
and
66 deletions
+133
-66
lib/models/activity.dart
lib/models/activity.dart
+10
-0
lib/utils/graph_utils.dart
lib/utils/graph_utils.dart
+19
-1
lib/utils/my_line_chart.dart
lib/utils/my_line_chart.dart
+7
-1
lib/widgets/activity_widgets/activity_heart_rate_widget.dart
lib/widgets/activity_widgets/activity_heart_rate_widget.dart
+84
-59
lib/widgets/activity_widgets/activity_power_widget.dart
lib/widgets/activity_widgets/activity_power_widget.dart
+1
-1
lib/widgets/charts/actitvity_charts/activity_heart_rate_chart.dart
...ts/charts/actitvity_charts/activity_heart_rate_chart.dart
+11
-3
lib/widgets/charts/lap_charts/lap_power_chart.dart
lib/widgets/charts/lap_charts/lap_power_chart.dart
+1
-1
No files found.
lib/models/activity.dart
View file @
aaf964fa
...
...
@@ -16,6 +16,8 @@ import 'package:intl/intl.dart';
import
'package:encrateia/utils/enums.dart'
;
import
'dart:io'
;
import
'heart_rate_zone_schema.dart'
;
class
Activity
extends
ChangeNotifier
{
DbActivity
db
;
List
<
Event
>
_records
;
...
...
@@ -515,4 +517,12 @@ class Activity extends ChangeNotifier {
);
return
powerZoneSchema
;
}
getHeartRateZoneSchema
()
async
{
var
heartRateZoneSchema
=
await
HeartRateZoneSchema
.
getBy
(
athletesId:
db
.
athletesId
,
date:
db
.
timeCreated
,
);
return
heartRateZoneSchema
;
}
}
lib/utils/graph_utils.dart
View file @
aaf964fa
import
'package:encrateia/models/heart_rate_zone.dart'
;
import
'package:encrateia/models/lap.dart'
;
import
'package:charts_flutter/flutter.dart'
;
import
'package:encrateia/models/power_zone.dart'
;
...
...
@@ -59,7 +60,7 @@ class GraphUtils {
];
}
static
z
oneAnnotations
({
List
<
PowerZone
>
powerZones
})
{
static
powerZ
oneAnnotations
({
List
<
PowerZone
>
powerZones
})
{
List
<
RangeAnnotationSegment
<
int
>>
rangeAnnotationSegmentList
=
[];
if
(
powerZones
!=
null
)
{
...
...
@@ -74,7 +75,24 @@ class GraphUtils {
)
];
}
return
rangeAnnotationSegmentList
;
}
static
heartRateZoneAnnotations
({
List
<
HeartRateZone
>
heartRateZones
})
{
List
<
RangeAnnotationSegment
<
int
>>
rangeAnnotationSegmentList
=
[];
if
(
heartRateZones
!=
null
)
{
rangeAnnotationSegmentList
=
[
for
(
HeartRateZone
heartRateZone
in
heartRateZones
)
RangeAnnotationSegment
(
heartRateZone
.
db
.
lowerLimit
,
heartRateZone
.
db
.
upperLimit
,
RangeAnnotationAxisType
.
measure
,
startLabel:
heartRateZone
.
db
.
name
,
color:
convertedColor
(
dbColor:
heartRateZone
.
db
.
color
),
)
];
}
return
rangeAnnotationSegmentList
;
}
...
...
lib/utils/my_line_chart.dart
View file @
aaf964fa
...
...
@@ -8,6 +8,7 @@ class MyLineChart extends LineChart {
@required
maxDomain
,
@required
laps
,
powerZones
,
heartRateZones
,
@required
domainTitle
,
measureTitle
,
measureTickProviderSpec
,
...
...
@@ -26,7 +27,12 @@ class MyLineChart extends LineChart {
behaviors:
[
RangeAnnotation
(
GraphUtils
.
rangeAnnotations
(
laps:
laps
)
+
GraphUtils
.
zoneAnnotations
(
powerZones:
powerZones
),
GraphUtils
.
powerZoneAnnotations
(
powerZones:
powerZones
,
)
+
GraphUtils
.
heartRateZoneAnnotations
(
heartRateZones:
heartRateZones
,
),
),
ChartTitle
(
domainTitle
,
...
...
lib/widgets/activity_widgets/activity_heart_rate_widget.dart
View file @
aaf964fa
import
'package:encrateia/models/heart_rate_zone.dart'
;
import
'package:encrateia/models/heart_rate_zone_schema.dart'
;
import
'package:encrateia/widgets/charts/actitvity_charts/activity_heart_rate_chart.dart'
;
import
'package:flutter/material.dart'
;
import
'package:encrateia/models/activity.dart'
;
...
...
@@ -5,72 +7,95 @@ import 'package:encrateia/models/event.dart';
import
'package:encrateia/models/lap.dart'
;
import
'package:encrateia/utils/icon_utils.dart'
;
class
ActivityHeartRateWidget
extends
State
less
Widget
{
class
ActivityHeartRateWidget
extends
State
ful
Widget
{
final
Activity
activity
;
ActivityHeartRateWidget
({
this
.
activity
});
@override
_ActivityHeartRateWidgetState
createState
()
=>
_ActivityHeartRateWidgetState
();
}
class
_ActivityHeartRateWidgetState
extends
State
<
ActivityHeartRateWidget
>
{
List
<
Event
>
records
=
[];
HeartRateZoneSchema
heartRateZoneSchema
;
List
<
HeartRateZone
>
heartRateZones
;
@override
void
initState
()
{
getData
();
super
.
initState
();
}
@override
Widget
build
(
context
)
{
return
FutureBuilder
<
List
<
Event
>>(
future:
activity
.
records
,
builder:
(
BuildContext
context
,
AsyncSnapshot
<
List
<
Event
>>
snapshot
)
{
if
(
snapshot
.
hasData
)
{
var
heartRateRecords
=
snapshot
.
data
.
where
((
value
)
=>
value
.
db
.
heartRate
!=
null
&&
value
.
db
.
heartRate
>
10
)
.
toList
();
if
(
records
!=
null
)
{
var
heartRateRecords
=
records
.
where
(
(
value
)
=>
value
.
db
.
heartRate
!=
null
&&
value
.
db
.
heartRate
>
10
)
.
toList
();
if
(
heartRateRecords
.
length
>
0
)
{
var
records
=
snapshot
.
data
;
return
ListTileTheme
(
iconColor:
Colors
.
deepOrange
,
child:
ListView
(
padding:
EdgeInsets
.
only
(
left:
25
),
children:
<
Widget
>[
ActivityHeartRateChart
(
records:
heartRateRecords
,
activity:
activity
,
),
ListTile
(
leading:
MyIcon
.
average
,
title:
Text
(
activity
.
db
.
avgHeartRate
.
toString
()),
subtitle:
Text
(
"average heart rate"
),
),
ListTile
(
leading:
MyIcon
.
minimum
,
title:
Text
(
Lap
.
minHeartRate
(
records:
records
)),
subtitle:
Text
(
"minimum heart rate"
),
),
ListTile
(
leading:
MyIcon
.
maximum
,
title:
Text
(
activity
.
db
.
maxHeartRate
.
toString
()),
subtitle:
Text
(
"maximum heart rate"
),
),
ListTile
(
leading:
MyIcon
.
standardDeviation
,
title:
Text
(
Lap
.
sdevHeartRate
(
records:
records
)),
subtitle:
Text
(
"standard deviation heart rate"
),
),
ListTile
(
leading:
MyIcon
.
amount
,
title:
Text
(
heartRateRecords
.
length
.
toString
()),
subtitle:
Text
(
"number of measurements"
),
),
],
if
(
heartRateRecords
.
length
>
0
)
{
return
ListTileTheme
(
iconColor:
Colors
.
deepOrange
,
child:
ListView
(
padding:
EdgeInsets
.
only
(
left:
25
),
children:
<
Widget
>[
ActivityHeartRateChart
(
records:
heartRateRecords
,
activity:
widget
.
activity
,
heartRateZones:
heartRateZones
,
),
ListTile
(
leading:
MyIcon
.
average
,
title:
Text
(
widget
.
activity
.
db
.
avgHeartRate
.
toString
()),
subtitle:
Text
(
"average heart rate"
),
),
);
}
else
{
return
Center
(
child:
Text
(
"No heart rate data available."
),
);
}
}
else
{
return
Center
(
child:
Text
(
"Loading"
),
);
}
},
);
ListTile
(
leading:
MyIcon
.
minimum
,
title:
Text
(
Lap
.
minHeartRate
(
records:
records
)),
subtitle:
Text
(
"minimum heart rate"
),
),
ListTile
(
leading:
MyIcon
.
maximum
,
title:
Text
(
widget
.
activity
.
db
.
maxHeartRate
.
toString
()),
subtitle:
Text
(
"maximum heart rate"
),
),
ListTile
(
leading:
MyIcon
.
standardDeviation
,
title:
Text
(
Lap
.
sdevHeartRate
(
records:
records
)),
subtitle:
Text
(
"standard deviation heart rate"
),
),
ListTile
(
leading:
MyIcon
.
amount
,
title:
Text
(
heartRateRecords
.
length
.
toString
()),
subtitle:
Text
(
"number of measurements"
),
),
],
),
);
}
else
{
return
Center
(
child:
Text
(
"No heart rate data available."
),
);
}
}
else
{
return
Center
(
child:
Text
(
"Loading"
),
);
}
}
getData
()
async
{
Activity
activity
=
widget
.
activity
;
records
=
await
activity
.
records
;
heartRateZoneSchema
=
await
activity
.
getHeartRateZoneSchema
();
if
(
heartRateZoneSchema
!=
null
)
heartRateZones
=
await
heartRateZoneSchema
.
heartRateZones
;
else
heartRateZones
=
[];
setState
(()
{});
}
}
lib/widgets/activity_widgets/activity_power_widget.dart
View file @
aaf964fa
...
...
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import
'package:encrateia/models/activity.dart'
;
import
'package:encrateia/models/event.dart'
;
import
'package:encrateia/utils/num_utils.dart'
;
import
'
..
/charts/actitvity_charts/activity_power_chart.dart'
;
import
'
package:encrateia/widgets
/charts/actitvity_charts/activity_power_chart.dart'
;
import
'package:encrateia/utils/icon_utils.dart'
;
import
'package:encrateia/utils/date_time_utils.dart'
;
...
...
lib/widgets/charts/actitvity_charts/activity_heart_rate_chart.dart
View file @
aaf964fa
import
'package:charts_flutter/flutter.dart'
;
import
'package:encrateia/models/heart_rate_zone.dart'
;
import
'package:encrateia/models/plot_point.dart'
;
import
'package:flutter/material.dart'
;
import
'package:encrateia/models/activity.dart'
;
...
...
@@ -11,8 +12,13 @@ import 'package:encrateia/utils/enums.dart';
class
ActivityHeartRateChart
extends
StatelessWidget
{
final
List
<
Event
>
records
;
final
Activity
activity
;
final
List
<
HeartRateZone
>
heartRateZones
;
ActivityHeartRateChart
({
this
.
records
,
@required
this
.
activity
});
ActivityHeartRateChart
({
this
.
records
,
@required
this
.
activity
,
this
.
heartRateZones
,
});
@override
Widget
build
(
BuildContext
context
)
{
...
...
@@ -23,7 +29,7 @@ class ActivityHeartRateChart extends StatelessWidget {
);
List
<
Series
<
dynamic
,
num
>>
data
=
[
Series
<
IntPlotPoint
,
int
>(
Series
<
IntPlotPoint
,
int
>(
id:
'Heart Rate'
,
colorFn:
(
_
,
__
)
=>
MaterialPalette
.
red
.
shadeDefault
,
domainFn:
(
IntPlotPoint
point
,
_
)
=>
point
.
domain
,
...
...
@@ -43,6 +49,7 @@ class ActivityHeartRateChart extends StatelessWidget {
data:
data
,
maxDomain:
records
.
last
.
db
.
distance
,
laps:
laps
,
heartRateZones:
heartRateZones
,
domainTitle:
'Heart Rate (bpm)'
,
measureTickProviderSpec:
BasicNumericTickProviderSpec
(
zeroBound:
false
,
...
...
@@ -52,7 +59,8 @@ class ActivityHeartRateChart extends StatelessWidget {
BasicNumericTickProviderSpec
(
desiredTickCount:
6
),
),
);
}
else
return
GraphUtils
.
loadingContainer
;
}
else
return
GraphUtils
.
loadingContainer
;
},
);
}
...
...
lib/widgets/charts/lap_charts/lap_power_chart.dart
View file @
aaf964fa
...
...
@@ -40,7 +40,7 @@ class LapPowerChart extends StatelessWidget {
animate:
false
,
behaviors:
[
RangeAnnotation
(
GraphUtils
.
z
oneAnnotations
(
powerZones:
powerZones
),
GraphUtils
.
powerZ
oneAnnotations
(
powerZones:
powerZones
),
),
ChartTitle
(
"Power (W)"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment