|
|
@@ -761,8 +761,61 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
iPa = 50
|
|
|
}
|
|
|
|
|
|
- // HbA1c string:
|
|
|
+ // Averages:
|
|
|
+ // If more than l day of stats:
|
|
|
let stats = storage.retrieve(OpenAPS.Monitor.dailyStats, as: [DailyStats].self)
|
|
|
+
|
|
|
+ var avgS: Decimal = 0
|
|
|
+ var nrAvgs: Decimal = 0
|
|
|
+ var sevenDaysAvg: Decimal = 0
|
|
|
+ var thirtyDaysAverage: Decimal = 0
|
|
|
+ var totalDataAvg: Decimal = 0
|
|
|
+ let arraysInjson = stats?.count ?? 0
|
|
|
+ // let end = arraysInjson - 1
|
|
|
+ var i = 0
|
|
|
+
|
|
|
+ if arraysInjson > 1 {
|
|
|
+ while i < arraysInjson {
|
|
|
+ avgS += stats?[i].BG_daily_Average_mg_dl as! Decimal
|
|
|
+ nrAvgs += 1
|
|
|
+ if nrAvgs >= 1 {
|
|
|
+ totalDataAvg = avgS / nrAvgs
|
|
|
+ }
|
|
|
+ if nrAvgs == 7 {
|
|
|
+ sevenDaysAvg = avgS / nrAvgs
|
|
|
+ }
|
|
|
+ if nrAvgs == 30 {
|
|
|
+ thirtyDaysAverage = avgS / nrAvgs
|
|
|
+ }
|
|
|
+ i += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // HbA1c estimation (%, mmol/mol
|
|
|
+ let NGSPa1CStatisticValue = (46.7 + tir().averageGlucose) / 28.7 // NGSP (%)
|
|
|
+ let IFCCa1CStatisticValue = 10.929 *
|
|
|
+ (NGSPa1CStatisticValue - 2.152) // IFCC (mmol/mol) A1C(mmol/mol) = 10.929 * (A1C(%) - 2.15)
|
|
|
+ // 7 days
|
|
|
+ let NGSPa1CStatisticValue_7 = (46.7 + sevenDaysAvg) / 28.7
|
|
|
+ let IFCCa1CStatisticValue_7 = 10.929 * (NGSPa1CStatisticValue_7 - 2.152)
|
|
|
+ // 14 days
|
|
|
+ let NGSPa1CStatisticValue_30 = (46.7 + thirtyDaysAverage) / 28.7
|
|
|
+ let IFCCa1CStatisticValue_30 = 10.929 * (NGSPa1CStatisticValue_30 - 2.152)
|
|
|
+ // A
|
|
|
+ let NGSPa1CStatisticValue_total = (46.7 + totalDataAvg) / 28.7
|
|
|
+ let IFCCa1CStatisticValue_total = 10.929 * (NGSPa1CStatisticValue_total - 2.152)
|
|
|
+
|
|
|
+ // Round
|
|
|
+ let HbA1cRoundedIFCC = round(Double(IFCCa1CStatisticValue) * 10) / 10
|
|
|
+ let HbA1cRoundedNGSP = round(Double(NGSPa1CStatisticValue) * 10) / 10
|
|
|
+ let HbA1cRoundedIFCC_7 = round(Double(IFCCa1CStatisticValue_7) * 10) / 10
|
|
|
+ let HbA1cRoundedNGSP_7 = round(Double(NGSPa1CStatisticValue_7) * 10) / 10
|
|
|
+ let HbA1cRoundedIFCC_30 = round(Double(IFCCa1CStatisticValue_30) * 10) / 10
|
|
|
+ let HbA1cRoundedNGSP_30 = round(Double(NGSPa1CStatisticValue_30) * 10) / 10
|
|
|
+ let HbA1cRoundedIFCC_total = round(Double(IFCCa1CStatisticValue_total) * 10) / 10
|
|
|
+ let HbA1cRoundedNGSP_total = round(Double(NGSPa1CStatisticValue_total) * 10) / 10
|
|
|
+
|
|
|
+ // HbA1c string:
|
|
|
let length__ = stats?.count ?? 0
|
|
|
var string7Days = ""
|
|
|
var string14Days = ""
|
|
|
@@ -770,20 +823,20 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
|
|
|
switch length__ {
|
|
|
case 7...:
|
|
|
- string7Days = " HbA1c for previous 7 days: \(tir().HbA1cIFCC_7) mmol/mol / \(tir().HbA1cNGSP_7) %."
|
|
|
+ string7Days = " HbA1c for previous 7 days: \(HbA1cRoundedIFCC_7) mmol/mol / \(HbA1cRoundedNGSP_7) %."
|
|
|
fallthrough
|
|
|
case 14...:
|
|
|
- string14Days = " HbA1c for previous 14 days: \(tir().HbA1cIFCC_14) mmol/mol / \(tir().HbA1cNGSP_14) %."
|
|
|
+ string14Days = " HbA1c for previous 30 days: \(HbA1cRoundedIFCC_30) mmol/mol / \(HbA1cRoundedNGSP_30) %."
|
|
|
fallthrough
|
|
|
case 2...:
|
|
|
stringTotal =
|
|
|
- " HbA1c for total number of days(\(length__)): \(tir().HbA1cIFCC_total) mmol/mol / \(tir().HbA1cNGSP_total) %."
|
|
|
+ " HbA1c for total number of days(\(length__)): \(HbA1cRoundedIFCC_total) mmol/mol / \(HbA1cRoundedNGSP_total) %."
|
|
|
default:
|
|
|
stringTotal = ""
|
|
|
}
|
|
|
|
|
|
let HbA1c_string =
|
|
|
- "Estimated HbA1c: \(tir().HbA1cIFCC) mmol/mol / \(tir().HbA1cNGSP) % and Average Blood Glucose: \(tir().averageGlucose) mg/dl / \(round(Double(tir().averageGlucose * 0.0555) * 10) / 10) mmol/l for the previous day, 00:00-23:59." +
|
|
|
+ "Estimated HbA1c: \(HbA1cRoundedIFCC) mmol/mol / \(HbA1cRoundedNGSP) % and Average Blood Glucose: \(tir().averageGlucose) mg/dl / \(round(Double(tir().averageGlucose * 0.0555) * 10) / 10) mmol/l for the previous day, 00:00-23:59." +
|
|
|
string7Days + string14Days + stringTotal
|
|
|
|
|
|
let dailystat = DailyStats(
|
|
|
@@ -830,29 +883,23 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
storage.transaction { storage in
|
|
|
storage.append(dailystat, to: file, uniqBy: \.id)
|
|
|
newEntries = storage.retrieve(file, as: [DailyStats].self)?
|
|
|
- .filter { $0.date.addingTimeInterval(1.days.timeInterval) < now }
|
|
|
.sorted { $0.date > $1.date } ?? []
|
|
|
+ .filter {
|
|
|
+ $0.date.addingTimeInterval(1.days.timeInterval) < now && $0.date
|
|
|
+ .addingTimeInterval(120.days.timeInterval) > Date() }
|
|
|
storage.save(Array(newEntries), as: file)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Time In Range (%), Average Glucose (24 hours) and HbA1c
|
|
|
+ // Time In Range (%), Average Glucose (24 hours)
|
|
|
func tir()
|
|
|
-> (
|
|
|
averageGlucose: Decimal,
|
|
|
hypos: Decimal,
|
|
|
hypers: Decimal,
|
|
|
- TIR: Decimal,
|
|
|
- HbA1cIFCC: Decimal,
|
|
|
- HbA1cNGSP: Decimal,
|
|
|
- HbA1cIFCC_7: Decimal,
|
|
|
- HbA1cNGSP_7: Decimal,
|
|
|
- HbA1cIFCC_14: Decimal,
|
|
|
- HbA1cNGSP_14: Decimal,
|
|
|
- HbA1cIFCC_total: Decimal,
|
|
|
- HbA1cNGSP_total: Decimal
|
|
|
+ TIR: Decimal
|
|
|
)
|
|
|
{
|
|
|
let glucose = storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self)
|
|
|
@@ -861,7 +908,7 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
let endIndex = length_ - 1
|
|
|
|
|
|
guard length_ != 0 else {
|
|
|
- return (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
|
+ return (0, 0, 0, 0)
|
|
|
}
|
|
|
|
|
|
var bg: Decimal = 0
|
|
|
@@ -873,39 +920,9 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
nr_bgs += 1
|
|
|
}
|
|
|
}
|
|
|
- var averageGlucose = bg / nr_bgs
|
|
|
+ var averageGlucose_ = bg / nr_bgs
|
|
|
// Round
|
|
|
- averageGlucose = Decimal(round(Double(averageGlucose)))
|
|
|
-
|
|
|
- // If more than l day of stats:
|
|
|
- let stats = storage.retrieve(OpenAPS.Monitor.dailyStats, as: [DailyStats].self)
|
|
|
-
|
|
|
- var avgS: Decimal = 0
|
|
|
- var nrAvgs: Decimal = 0
|
|
|
- var sevenDaysAvg: Decimal = 0
|
|
|
- var fourteenDaysAvg: Decimal = 0
|
|
|
- var totalDataAvg: Decimal = 0
|
|
|
- let arraysInjson = stats?.count ?? 0
|
|
|
-
|
|
|
- if arraysInjson > 1 {
|
|
|
- for entry in stats! {
|
|
|
- if stats?.BG_daily_Average_mg_dl != nil {
|
|
|
- avgS += entry.BG_daily_Average_mg_dl
|
|
|
- print("Average: \(entry.BG_daily_Average_mg_dl)")
|
|
|
- nrAvgs += 1
|
|
|
-
|
|
|
- if nrAvgs >= 1 {
|
|
|
- totalDataAvg = avgS / nrAvgs
|
|
|
- }
|
|
|
- if nrAvgs == 7 {
|
|
|
- sevenDaysAvg = avgS / nrAvgs
|
|
|
- }
|
|
|
- if nrAvgs == 14 {
|
|
|
- fourteenDaysAvg = avgS / nrAvgs
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ averageGlucose_ = Decimal(round(Double(averageGlucose_)))
|
|
|
|
|
|
let fullTime = glucose![0].date - glucose![endIndex].date
|
|
|
var timeInHypo: Decimal = 0
|
|
|
@@ -950,30 +967,6 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
let hyperRounded = round(Double(hypers) * 10) / 10
|
|
|
let TIRrounded = round((100 - (hypoRounded + hyperRounded)) * 10) / 10
|
|
|
|
|
|
- // HbA1c estimation (%, mmol/mol
|
|
|
- let NGSPa1CStatisticValue = (46.7 + averageGlucose) / 28.7 // NGSP (%)
|
|
|
- let IFCCa1CStatisticValue = 10.929 *
|
|
|
- (NGSPa1CStatisticValue - 2.152) // IFCC (mmol/mol) A1C(mmol/mol) = 10.929 * (A1C(%) - 2.15)
|
|
|
- // 7 days
|
|
|
- let NGSPa1CStatisticValue_7 = (46.7 + sevenDaysAvg) / 28.7
|
|
|
- let IFCCa1CStatisticValue_7 = 10.929 * (NGSPa1CStatisticValue_7 - 2.152)
|
|
|
- // 14 days
|
|
|
- let NGSPa1CStatisticValue_14 = (46.7 + fourteenDaysAvg) / 28.7
|
|
|
- let IFCCa1CStatisticValue_14 = 10.929 * (NGSPa1CStatisticValue_14 - 2.152)
|
|
|
- // A
|
|
|
- let NGSPa1CStatisticValue_total = (46.7 + totalDataAvg) / 28.7
|
|
|
- let IFCCa1CStatisticValue_total = 10.929 * (NGSPa1CStatisticValue_total - 2.152)
|
|
|
-
|
|
|
- // Round
|
|
|
- let HbA1cRoundedIFCC = round(Double(IFCCa1CStatisticValue) * 10) / 10
|
|
|
- let HbA1cRoundedNGSP = round(Double(NGSPa1CStatisticValue) * 10) / 10
|
|
|
- let HbA1cRoundedIFCC_7 = round(Double(IFCCa1CStatisticValue_7) * 10) / 10
|
|
|
- let HbA1cRoundedNGSP_7 = round(Double(NGSPa1CStatisticValue_7) * 10) / 10
|
|
|
- let HbA1cRoundedIFCC_14 = round(Double(IFCCa1CStatisticValue_14) * 10) / 10
|
|
|
- let HbA1cRoundedNGSP_14 = round(Double(NGSPa1CStatisticValue_14) * 10) / 10
|
|
|
- let HbA1cRoundedIFCC_total = round(Double(IFCCa1CStatisticValue_total) * 10) / 10
|
|
|
- let HbA1cRoundedNGSP_total = round(Double(NGSPa1CStatisticValue_total) * 10) / 10
|
|
|
-
|
|
|
// For testing. See in Xcode console each loop.
|
|
|
/*
|
|
|
print(
|
|
|
@@ -982,18 +975,10 @@ final class BaseAPSManager: APSManager, Injectable {
|
|
|
*/
|
|
|
|
|
|
return (
|
|
|
- averageGlucose,
|
|
|
+ averageGlucose_,
|
|
|
Decimal(hypoRounded),
|
|
|
Decimal(hyperRounded),
|
|
|
- Decimal(TIRrounded),
|
|
|
- Decimal(HbA1cRoundedIFCC),
|
|
|
- Decimal(HbA1cRoundedNGSP),
|
|
|
- Decimal(HbA1cRoundedIFCC_7),
|
|
|
- Decimal(HbA1cRoundedNGSP_7),
|
|
|
- Decimal(HbA1cRoundedIFCC_14),
|
|
|
- Decimal(HbA1cRoundedNGSP_14),
|
|
|
- Decimal(HbA1cRoundedIFCC_total),
|
|
|
- Decimal(HbA1cRoundedNGSP_total)
|
|
|
+ Decimal(TIRrounded)
|
|
|
)
|
|
|
}
|
|
|
|