|
...
|
...
|
@@ -316,16 +316,27 @@ class LocalHealthDataConvert { |
|
|
|
required List<DateTime> previousDays,
|
|
|
|
required List<HealthRawHrvStressPoint> hrvPoints,
|
|
|
|
required List<HealthRawDailyStressPoint> dailyStressPoints,
|
|
|
|
required List<HealthKitRawDataPoint> restingHeartRate,
|
|
|
|
}) {
|
|
|
|
final daily = <_HrvDaySummary>[];
|
|
|
|
for (final day in days) {
|
|
|
|
final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints);
|
|
|
|
final summary = _hrvDaySummary(
|
|
|
|
day,
|
|
|
|
hrvPoints,
|
|
|
|
dailyStressPoints,
|
|
|
|
restingHeartRate,
|
|
|
|
);
|
|
|
|
if (summary.hasData) daily.add(summary);
|
|
|
|
}
|
|
|
|
final validDaily = daily.where((e) => e.hrvAverage != null).toList();
|
|
|
|
final previousDaily = <_HrvDaySummary>[];
|
|
|
|
for (final day in previousDays) {
|
|
|
|
final summary = _hrvDaySummary(day, hrvPoints, dailyStressPoints);
|
|
|
|
final summary = _hrvDaySummary(
|
|
|
|
day,
|
|
|
|
hrvPoints,
|
|
|
|
dailyStressPoints,
|
|
|
|
const <HealthKitRawDataPoint>[],
|
|
|
|
);
|
|
|
|
if (summary.hasData) previousDaily.add(summary);
|
|
|
|
}
|
|
|
|
final trendList = dateRangeType == 2
|
|
...
|
...
|
@@ -336,6 +347,7 @@ class LocalHealthDataConvert { |
|
|
|
timeKey: dateKey(item.day),
|
|
|
|
hrvAverage: item.hrvAverage,
|
|
|
|
hrAverage: item.hrAverage,
|
|
|
|
lastRestingHrValue: item.lastRestingHrValue,
|
|
|
|
comprehensiveStressScore: item.comprehensiveStressScore,
|
|
|
|
state: item.state,
|
|
|
|
),
|
|
...
|
...
|
@@ -528,9 +540,7 @@ class LocalHealthDataConvert { |
|
|
|
latestHrv: (latest?.result ?? 0).floor().toDouble(),
|
|
|
|
latestDataTime: latest?.rawEndTime,
|
|
|
|
state: latest?.state.value,
|
|
|
|
tip: _latestHrvTip(
|
|
|
|
latest: latest
|
|
|
|
),
|
|
|
|
tip: _latestHrvTip(latest: latest),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
...
|
...
|
@@ -617,9 +627,7 @@ class LocalHealthDataConvert { |
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
static String? _latestHrvTip({
|
|
|
|
required HealthRawHrvStressPoint? latest
|
|
|
|
}) {
|
|
|
|
static String? _latestHrvTip({required HealthRawHrvStressPoint? latest}) {
|
|
|
|
if (latest == null) return null;
|
|
|
|
|
|
|
|
final isAboveBaseline = latest.result >= latest.baselineHrv;
|
|
...
|
...
|
@@ -696,17 +704,24 @@ class LocalHealthDataConvert { |
|
|
|
DateTime day,
|
|
|
|
List<HealthRawHrvStressPoint> hrv,
|
|
|
|
List<HealthRawDailyStressPoint> dailyStress,
|
|
|
|
List<HealthKitRawDataPoint> restingHeartRate,
|
|
|
|
) {
|
|
|
|
final start = unixSeconds(day);
|
|
|
|
final end = unixSeconds(day.add(const Duration(days: 1)));
|
|
|
|
final dayHrv =
|
|
|
|
hrv.where((e) => e.rawEndTime >= start && e.rawEndTime < end).toList();
|
|
|
|
final dayRestingHr = restingHeartRate
|
|
|
|
.where((e) => e.endTime >= start && e.endTime < end)
|
|
|
|
.toList()
|
|
|
|
..sort((a, b) => a.endTime.compareTo(b.endTime));
|
|
|
|
final stress = _dailyStressPointForDay(day, dailyStress);
|
|
|
|
final hrvAverage = _averageOrNull(dayHrv.map((e) => e.result).toList());
|
|
|
|
return _HrvDaySummary(
|
|
|
|
day: day,
|
|
|
|
hrvAverage: hrvAverage?.toDouble(),
|
|
|
|
hrAverage: stress?.stressScore.toDouble(),
|
|
|
|
lastRestingHrValue:
|
|
|
|
dayRestingHr.isEmpty ? null : dayRestingHr.last.value?.floor(),
|
|
|
|
comprehensiveStressScore: stress?.stressScore.toDouble(),
|
|
|
|
state: stress?.state.value,
|
|
|
|
);
|
|
...
|
...
|
@@ -1019,6 +1034,7 @@ class _HrvDaySummary { |
|
|
|
required this.day,
|
|
|
|
required this.hrvAverage,
|
|
|
|
required this.hrAverage,
|
|
|
|
required this.lastRestingHrValue,
|
|
|
|
required this.comprehensiveStressScore,
|
|
|
|
required this.state,
|
|
|
|
});
|
|
...
|
...
|
@@ -1026,6 +1042,7 @@ class _HrvDaySummary { |
|
|
|
final DateTime day;
|
|
|
|
final double? hrvAverage;
|
|
|
|
final double? hrAverage;
|
|
|
|
final int? lastRestingHrValue;
|
|
|
|
final double? comprehensiveStressScore;
|
|
|
|
final int? state;
|
|
|
|
|
...
|
...
|
|