Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions LoopFollow.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
6589CC6C2E9E7D1600BB18FE /* GraphSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */; };
6589CC6D2E9E7D1600BB18FE /* CalendarSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC582E9E7D1600BB18FE /* CalendarSettingsView.swift */; };
6589CC6E2E9E7D1600BB18FE /* SettingsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */; };
65A100012F5AA00000AA1001 /* UnitsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */; };
65A100032F5AA00000AA1002 /* UnitsConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */; };
6589CC6F2E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC572E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift */; };
6589CC712E9E814F00BB18FE /* AlarmSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC702E9E814F00BB18FE /* AlarmSelectionView.swift */; };
6589CC752E9EAFB700BB18FE /* SettingsMigrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC742E9EAFB700BB18FE /* SettingsMigrationManager.swift */; };
Expand Down Expand Up @@ -437,6 +439,8 @@
6589CC5D2E9E7D1600BB18FE /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = "<group>"; };
6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsView.swift; sourceTree = "<group>"; };
6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuView.swift; sourceTree = "<group>"; };
65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitsSettingsView.swift; sourceTree = "<group>"; };
65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitsConfigurationView.swift; sourceTree = "<group>"; };
6589CC602E9E7D1600BB18FE /* TabCustomizationModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabCustomizationModal.swift; sourceTree = "<group>"; };
6589CC702E9E814F00BB18FE /* AlarmSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlarmSelectionView.swift; sourceTree = "<group>"; };
6589CC742E9EAFB700BB18FE /* SettingsMigrationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMigrationManager.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -868,6 +872,8 @@
6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */,
657F98172F043D8100F732BD /* HomeContentView.swift */,
6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */,
65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */,
65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */,
6589CC602E9E7D1600BB18FE /* TabCustomizationModal.swift */,
);
path = Settings;
Expand Down Expand Up @@ -2077,6 +2083,8 @@
6589CC6C2E9E7D1600BB18FE /* GraphSettingsView.swift in Sources */,
6589CC6D2E9E7D1600BB18FE /* CalendarSettingsView.swift in Sources */,
6589CC6E2E9E7D1600BB18FE /* SettingsMenuView.swift in Sources */,
65A100012F5AA00000AA1001 /* UnitsSettingsView.swift in Sources */,
65A100032F5AA00000AA1002 /* UnitsConfigurationView.swift in Sources */,
657F98182F043D8100F732BD /* HomeContentView.swift in Sources */,
6589CC6F2E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift in Sources */,
DD493ADF2ACF22BB009A6922 /* SAge.swift in Sources */,
Expand Down
4 changes: 3 additions & 1 deletion LoopFollow/Application/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="xGF-Pj-QE0">
<rect key="frame" x="102.66666666666666" y="0.0" width="92.666666666666657" height="45"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Est A1C:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WV0-Jy-FPs" userLabel="Est A1C:">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Est. A1C:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WV0-Jy-FPs" userLabel="Est. A1C:">
<rect key="frame" x="18.333333333333346" y="0.0" width="56.333333333333343" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<nil key="textColor"/>
Expand Down Expand Up @@ -306,11 +306,13 @@
<outlet property="smallGraphHeightConstraint" destination="qmO-ga-QWl" id="VsZ-zJ-LsJ"/>
<outlet property="statsAvgBG" destination="jpA-Nb-pU7" id="Uo8-a4-Aus"/>
<outlet property="statsEstA1C" destination="7Jx-XF-1vS" id="4RD-nm-JxO"/>
<outlet property="statsEstA1CTitle" destination="WV0-Jy-FPs" id="WnU-h8-2hf"/>
<outlet property="statsHighPercent" destination="HON-rt-8pC" id="283-3S-PCR"/>
<outlet property="statsInRangePercent" destination="7mH-Np-j0L" id="vUp-Pv-Mva"/>
<outlet property="statsLowPercent" destination="TzL-hn-9qu" id="0QR-Mz-KJe"/>
<outlet property="statsPieChart" destination="Hhh-F1-s1p" id="Rhh-Up-Kr0"/>
<outlet property="statsStdDev" destination="wAI-Tp-784" id="BUZ-lS-JfA"/>
<outlet property="statsStdDevTitle" destination="iXC-Mz-I09" id="QHf-Q8-J7B"/>
<outlet property="statsView" destination="ikj-at-auF" id="7AQ-VA-Pw2"/>
</connections>
</viewController>
Expand Down
23 changes: 17 additions & 6 deletions LoopFollow/Controllers/Graphs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,12 @@ class TempTargetRenderer: LineChartRenderer {

let ScaleXMax: Double = 150.0
extension MainViewController {
private func graphRangeThresholds() -> (low: Double, high: Double) {
let low = 70.0
let high = UnitSettingsStore.shared.timeInRangeMode == .titr ? 140.0 : 180.0
return (low, high)
}

func updateChartRenderers() {
let tempTargetDataIndex = GraphDataIndex.tempTarget.rawValue
let smbDataIndex = GraphDataIndex.smb.rawValue
Expand Down Expand Up @@ -621,15 +627,17 @@ extension MainViewController {
// Clear limit lines so they don't add multiples when changing the settings
BGChart.rightAxis.removeAllLimitLines()

let thresholds = graphRangeThresholds()

// Add lower red line based on low alert value
let ll = ChartLimitLine()
ll.limit = Storage.shared.lowLine.value
ll.limit = thresholds.low
ll.lineColor = NSUIColor.systemRed.withAlphaComponent(0.5)
BGChart.rightAxis.addLimitLine(ll)

// Add upper yellow line based on low alert value
let ul = ChartLimitLine()
ul.limit = Storage.shared.highLine.value
ul.limit = thresholds.high
ul.lineColor = NSUIColor.systemYellow.withAlphaComponent(0.5)
BGChart.rightAxis.addLimitLine(ul)

Expand Down Expand Up @@ -780,15 +788,17 @@ extension MainViewController {
// Clear limit lines so they don't add multiples when changing the settings
BGChart.rightAxis.removeAllLimitLines()

let thresholds = graphRangeThresholds()

// Add lower red line based on low alert value
let ll = ChartLimitLine()
ll.limit = Storage.shared.lowLine.value
ll.limit = thresholds.low
ll.lineColor = NSUIColor.systemRed.withAlphaComponent(0.5)
BGChart.rightAxis.addLimitLine(ll)

// Add upper yellow line based on low alert value
let ul = ChartLimitLine()
ul.limit = Storage.shared.highLine.value
ul.limit = thresholds.high
ul.lineColor = NSUIColor.systemYellow.withAlphaComponent(0.5)
BGChart.rightAxis.addLimitLine(ul)

Expand All @@ -815,6 +825,7 @@ extension MainViewController {
var colors = [NSUIColor]()

topBG = Storage.shared.minBGScale.value
let thresholds = graphRangeThresholds()
for i in 0 ..< entries.count {
if Double(entries[i].sgv) > topBG - maxBGOffset {
topBG = Double(entries[i].sgv) + maxBGOffset
Expand All @@ -823,9 +834,9 @@ extension MainViewController {
mainChart.append(value)
smallChart.append(value)

if Double(entries[i].sgv) >= Storage.shared.highLine.value {
if Double(entries[i].sgv) >= thresholds.high {
colors.append(NSUIColor.systemYellow)
} else if Double(entries[i].sgv) <= Storage.shared.lowLine.value {
} else if Double(entries[i].sgv) <= thresholds.low {
colors.append(NSUIColor.systemRed)
} else {
colors.append(NSUIColor.systemGreen)
Expand Down
17 changes: 15 additions & 2 deletions LoopFollow/Controllers/MainViewController+updateStats.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,25 @@ extension MainViewController {
statsInRangePercent.text = String(format: "%.1f%%", stats.percentRange)
statsHighPercent.text = String(format: "%.1f%%", stats.percentHigh)
statsAvgBG.text = Localizer.toDisplayUnits(String(format: "%.0f", stats.avgBG))
if Storage.shared.useIFCC.value {
statsEstA1CTitle.text = UnitSettingsStore.shared.glycemicMetricMode == .gmi ? "GMI:" : "Est. A1C:"

if UnitSettingsStore.shared.glycemicOutputUnit == .mmolMol {
statsEstA1C.text = String(format: "%.0f", stats.a1C)
} else {
statsEstA1C.text = String(format: "%.1f", stats.a1C)
}
statsStdDev.text = String(format: "%.2f", stats.stdDev)

if UnitSettingsStore.shared.variabilityMetricMode == .stdDeviation {
statsStdDevTitle.text = "Std Dev:"
if UnitSettingsStore.shared.glucoseUnit == .mgdL {
statsStdDev.text = String(format: "%.0f", stats.stdDev)
} else {
statsStdDev.text = String(format: "%.1f", stats.stdDev)
}
} else {
statsStdDevTitle.text = "CV:"
statsStdDev.text = String(format: "%.1f%%", stats.coefficientOfVariation)
}

createStatsPie(pieData: stats.pie)
}
Expand Down
25 changes: 17 additions & 8 deletions LoopFollow/Controllers/Stats.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class StatsData {
var avgBG: Float
var a1C: Float
var stdDev: Float
var coefficientOfVariation: Float
var bgDataCount: Int
var pie: [DataStructs.pieData]

Expand All @@ -23,12 +24,16 @@ class StatsData {
countHigh = 0
totalGlucose = 0
a1C = 0.0
coefficientOfVariation = 0.0

let lowThreshold = 70.0
let highThreshold = UnitSettingsStore.shared.timeInRangeMode == .titr ? 140.0 : 180.0

for i in 0 ..< bgData.count {
// Set low/range/high counts for pie chart and %'s
if Double(bgData[i].sgv) <= Storage.shared.lowLine.value {
if Double(bgData[i].sgv) < lowThreshold {
countLow += 1
} else if Double(bgData[i].sgv) >= Storage.shared.highLine.value {
} else if Double(bgData[i].sgv) > highThreshold {
countHigh += 1
} else {
countRange += 1
Expand Down Expand Up @@ -60,15 +65,19 @@ class StatsData {
partialSum += (Float(bgData[i].sgv) - avgBG) * (Float(bgData[i].sgv) - avgBG)
}

stdDev = sqrt(partialSum / Float(bgData.count))
if Storage.shared.units.value != "mg/dL" {
stdDev = stdDev * Float(GlucoseConversion.mgDlToMmolL)
let stdDevMgdL = sqrt(partialSum / Float(bgData.count))
if avgBG > 0 {
coefficientOfVariation = (stdDevMgdL / avgBG) * 100.0
}
stdDev = Float(UnitSettingsStore.shared.convertMgdlToDisplay(Double(stdDevMgdL)))

if Storage.shared.useIFCC.value {
a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
let avgBGDisplay = UnitSettingsStore.shared.convertMgdlToDisplay(Double(avgBG))
let metricValue: Double?
if UnitSettingsStore.shared.glycemicMetricMode == .gmi {
metricValue = GlycemicMetricCalculator.calculateGMI(avgGlucoseInDisplayUnits: avgBGDisplay)
} else {
a1C = (46.7 + Float(avgBG)) / 28.7
metricValue = GlycemicMetricCalculator.calculateEhba1c(avgGlucoseInDisplayUnits: avgBGDisplay)
}
a1C = Float(metricValue ?? 0.0)
}
}
Loading