Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b6f2594

Browse files
authoredSep 11, 2024
Use LoopAlgorithm basal overlay for computing total delivery (#700)
1 parent d640b55 commit b6f2594

File tree

5 files changed

+37
-12
lines changed

5 files changed

+37
-12
lines changed
 

‎Loop/Managers/LoopDataManager.swift

+33-4
Original file line numberDiff line numberDiff line change
@@ -276,18 +276,27 @@ final class LoopDataManager: ObservableObject {
276276

277277
func fetchData(
278278
for baseTime: Date = Date(),
279-
disablingPreMeal: Bool = false
279+
disablingPreMeal: Bool = false,
280+
ensureDosingCoverageStart: Date? = nil
280281
) async throws -> StoredDataAlgorithmInput {
281282
// Need to fetch doses back as far as t - (DIA + DCA) for Dynamic carbs
282283
let dosesInputHistory = CarbMath.maximumAbsorptionTimeInterval + InsulinMath.defaultInsulinActivityDuration
283284

284285
var dosesStart = baseTime.addingTimeInterval(-dosesInputHistory)
286+
287+
// Ensure dosing data goes back before ensureDosingCoverageStart, if specified
288+
if let ensureDosingCoverageStart {
289+
dosesStart = min(ensureDosingCoverageStart, dosesStart)
290+
}
291+
285292
let doses = try await doseStore.getNormalizedDoseEntries(
286293
start: dosesStart,
287294
end: baseTime
288295
)
289296

290-
dosesStart = doses.map { $0.startDate }.min() ?? dosesStart
297+
// Doses that were included because they cover dosesStart might have a start time earlier than dosesStart
298+
// This moves the start time back to ensure basal covers
299+
dosesStart = min(dosesStart, doses.map { $0.startDate }.min() ?? dosesStart)
291300

292301
let basal = try await settingsProvider.getBasalHistory(startDate: dosesStart, endDate: baseTime)
293302

@@ -411,7 +420,9 @@ final class LoopDataManager: ObservableObject {
411420
func updateDisplayState() async {
412421
var newState = AlgorithmDisplayState()
413422
do {
414-
var input = try await fetchData(for: now())
423+
let midnight = Calendar.current.startOfDay(for: Date())
424+
425+
var input = try await fetchData(for: now(), ensureDosingCoverageStart: midnight)
415426
input.recommendationType = .manualBolus
416427
newState.input = input
417428
newState.output = LoopAlgorithm.run(input: input)
@@ -598,6 +609,24 @@ final class LoopDataManager: ObservableObject {
598609
}
599610
}
600611

612+
public func totalDeliveredToday() async -> InsulinValue?
613+
{
614+
guard let data = displayState.input else {
615+
return nil
616+
}
617+
618+
let now = data.predictionStart
619+
let midnight = Calendar.current.startOfDay(for: now)
620+
621+
let annotatedDoses = data.doses.annotated(with: data.basal, fillBasalGaps: true)
622+
let trimmed = annotatedDoses.map { $0.trimmed(from: midnight, to: now)}
623+
624+
return InsulinValue(
625+
startDate: midnight,
626+
value: trimmed.reduce(0.0) { $0 + $1.volume }
627+
)
628+
}
629+
601630
var iobValues: [InsulinValue] {
602631
dosesRelativeToBasal.insulinOnBoardTimeline()
603632
}
@@ -1123,7 +1152,7 @@ extension LoopDataManager: SimpleBolusViewModelDelegate {
11231152

11241153
}
11251154

1126-
extension LoopDataManager: BolusEntryViewModelDelegate {
1155+
extension LoopDataManager: BolusEntryViewModelDelegate {
11271156
func saveGlucose(sample: LoopKit.NewGlucoseSample) async throws -> LoopKit.StoredGlucoseSample {
11281157
let storedSamples = try await addGlucose([sample])
11291158
return storedSamples.first!

‎Loop/Managers/Store Protocols/DoseStoreProtocol.swift

-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ protocol DoseStoreProtocol: AnyObject {
1717

1818
var lastReservoirValue: ReservoirValue? { get }
1919

20-
func getTotalUnitsDelivered(since startDate: Date) async throws -> InsulinValue
21-
2220
var lastAddedPumpData: Date { get }
2321
}
2422

‎Loop/View Controllers/InsulinDeliveryTableViewController.swift

+1-3
Original file line numberDiff line numberDiff line change
@@ -320,9 +320,7 @@ public final class InsulinDeliveryTableViewController: UITableViewController {
320320
private func updateTotal() {
321321
Task { @MainActor in
322322
if case .display = state {
323-
let midnight = Calendar.current.startOfDay(for: Date())
324-
325-
if let result = try? await doseStore?.getTotalUnitsDelivered(since: midnight) {
323+
if let result = await loopDataManager.totalDeliveredToday() {
326324
self.totalValueLabel.text = NumberFormatter.localizedString(from: NSNumber(value: result.value), number: .none)
327325
self.totalDateLabel.text = String(format: NSLocalizedString("com.loudnate.InsulinKit.totalDateLabel", value: "since %1$@", comment: "The format string describing the starting date of a total value. The first format argument is the localized date."), DateFormatter.localizedString(from: result.startDate, dateStyle: .none, timeStyle: .short))
328326
} else {

‎Loop/View Controllers/StatusTableViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ final class StatusTableViewController: LoopChartsTableViewController {
508508
doseEntries = loopManager.dosesRelativeToBasal.trimmed(from: startDate)
509509

510510
iobValues = loopManager.iobValues.filterDateRange(startDate, nil)
511-
totalDelivery = try? await loopManager.doseStore.getTotalUnitsDelivered(since: Calendar.current.startOfDay(for: Date())).value
511+
totalDelivery = await loopManager.totalDeliveredToday()?.value
512512
}
513513

514514
updatePresetModeAvailability(automaticDosingEnabled: automaticDosingEnabled)

‎Loop/View Models/BolusEntryViewModel.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protocol BolusEntryViewModelDelegate: AnyObject {
2727
var mostRecentGlucoseDataDate: Date? { get }
2828
var mostRecentPumpDataDate: Date? { get }
2929

30-
func fetchData(for baseTime: Date, disablingPreMeal: Bool) async throws -> StoredDataAlgorithmInput
30+
func fetchData(for baseTime: Date, disablingPreMeal: Bool, ensureDosingCoverageStart: Date?) async throws -> StoredDataAlgorithmInput
3131
func effectiveGlucoseTargetRangeSchedule(presumingMealEntry: Bool) -> GlucoseRangeSchedule?
3232

3333
func addCarbEntry(_ carbEntry: NewCarbEntry, replacing replacingEntry: StoredCarbEntry?) async throws -> StoredCarbEntry
@@ -515,7 +515,7 @@ final class BolusEntryViewModel: ObservableObject {
515515

516516
do {
517517
let startDate = now()
518-
var input = try await delegate.fetchData(for: startDate, disablingPreMeal: potentialCarbEntry != nil)
518+
var input = try await delegate.fetchData(for: startDate, disablingPreMeal: potentialCarbEntry != nil, ensureDosingCoverageStart: nil)
519519

520520
let insulinModel = delegate.insulinModel(for: deliveryDelegate?.pumpInsulinType)
521521

0 commit comments

Comments
 (0)
Please sign in to comment.