Skip to content

Commit 797ace3

Browse files
author
Rick Pasetto
authored
LOOP-3802: Adds trend to GlucoseStore (#434)
* LOOP-1328: Initialize GlucoseStore with whatever CGMManager reports as its healthKitStorageDelay * LOOP-1328: Adds `device` to CachedGlucoseObject * unit tests and WatchHistoricalGlucose * ckpt * pr feedback: remove unneeded change to `GlucoseStoreProtocol` * Revert unintended change
1 parent 6e37bab commit 797ace3

File tree

8 files changed

+49
-9
lines changed

8 files changed

+49
-9
lines changed

Common/Models/WatchContext.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,12 @@ extension WatchContext {
147147
extension WatchContext {
148148
var newGlucoseSample: NewGlucoseSample? {
149149
if let quantity = glucose, let date = glucoseDate, let syncIdentifier = glucoseSyncIdentifier {
150-
return NewGlucoseSample(date: date, quantity: quantity, isDisplayOnly: glucoseIsDisplayOnly ?? false, wasUserEntered: glucoseWasUserEntered ?? false, syncIdentifier: syncIdentifier, syncVersion: 0)
150+
return NewGlucoseSample(date: date,
151+
quantity: quantity,
152+
trend: glucoseTrendRawValue.flatMap { GlucoseTrend(rawValue: $0) },
153+
isDisplayOnly: glucoseIsDisplayOnly ?? false,
154+
wasUserEntered: glucoseWasUserEntered ?? false,
155+
syncIdentifier: syncIdentifier, syncVersion: 0)
151156
}
152157
return nil
153158
}

Common/Models/WatchHistoricalGlucose.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ extension WatchHistoricalGlucose: RawRepresentable {
4141
let syncVersions: [Int?]
4242
let startDates: [Date]
4343
let quantities: [Double]
44+
let trends: [GlucoseTrend?]
4445
let isDisplayOnlys: [Bool]
4546
let wasUserEntereds: [Bool]
4647
let devices: [Data?]
@@ -52,6 +53,7 @@ extension WatchHistoricalGlucose: RawRepresentable {
5253
self.syncVersions = samples.map { $0.syncVersion }
5354
self.startDates = samples.map { $0.startDate }
5455
self.quantities = samples.map { $0.quantity.doubleValue(for: .milligramsPerDeciliter) }
56+
self.trends = samples.map { $0.trend }
5557
self.isDisplayOnlys = samples.map { $0.isDisplayOnly }
5658
self.wasUserEntereds = samples.map { $0.wasUserEntered }
5759
self.devices = samples.map { try? WatchHistoricalGlucose.encoder.encode($0.device) }
@@ -65,6 +67,7 @@ extension WatchHistoricalGlucose: RawRepresentable {
6567
syncVersion: syncVersions[$0],
6668
startDate: startDates[$0],
6769
quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: quantities[$0]),
70+
trend: trends[$0],
6871
isDisplayOnly: isDisplayOnlys[$0],
6972
wasUserEntered: wasUserEntereds[$0],
7073
device: devices[$0].flatMap { try? HKDevice(from: $0) })

Loop/Extensions/GlucoseStore+SimulatedCoreData.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,29 @@ extension GlucoseStore {
2828
var simulated = [NewGlucoseSample]()
2929

3030
while startDate < endDate {
31-
simulated.append(NewGlucoseSample.simulated(date: startDate, value: simulatedValueBase + simulatedValueAmplitude * sin(value)))
31+
let prev = simulatedValueBase + simulatedValueAmplitude * sin(value - simulatedValueIncrement)
32+
let new = simulatedValueBase + simulatedValueAmplitude * sin(value)
33+
let trend: GlucoseTrend? = {
34+
switch new - prev {
35+
case -0.01...0.01:
36+
return .flat
37+
case -2 ..< -0.01:
38+
return .down
39+
case -5 ..< -2:
40+
return .downDown
41+
case -Double.greatestFiniteMagnitude ..< -5:
42+
return .downDownDown
43+
case 0.01...2:
44+
return .up
45+
case 2...5:
46+
return .upUp
47+
case 5...Double.greatestFiniteMagnitude:
48+
return .upUpUp
49+
default:
50+
return nil
51+
}
52+
}()
53+
simulated.append(NewGlucoseSample.simulated(date: startDate, value: new, trend: trend))
3254

3355
if simulated.count >= simulatedLimit {
3456
if let error = addSimulatedHistoricalGlucoseObjects(samples: simulated) {
@@ -62,9 +84,10 @@ extension GlucoseStore {
6284
}
6385

6486
fileprivate extension NewGlucoseSample {
65-
static func simulated(date: Date, value: Double, unit: HKUnit = HKUnit.milligramsPerDeciliter) -> NewGlucoseSample {
87+
static func simulated(date: Date, value: Double, trend: GlucoseTrend?, unit: HKUnit = HKUnit.milligramsPerDeciliter) -> NewGlucoseSample {
6688
return NewGlucoseSample(date: date,
6789
quantity: HKQuantity(unit: unit, doubleValue: value),
90+
trend: trend,
6891
isDisplayOnly: false,
6992
wasUserEntered: false,
7093
syncIdentifier: UUID().uuidString)

Loop/View Models/BolusEntryViewModel.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ final class BolusEntryViewModel: ObservableObject {
453453
NewGlucoseSample(
454454
date: entryDate,
455455
quantity: quantity,
456+
trend: nil, // All manual glucose entries are assumed to have no trend.
456457
isDisplayOnly: false,
457458
wasUserEntered: true,
458459
syncIdentifier: uuidProvider()

Loop/View Models/SimpleBolusViewModel.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,12 @@ class SimpleBolusViewModel: ObservableObject {
257257

258258
func saveManualGlucose(_ completion: @escaping (Bool) -> Void) {
259259
if let glucose = glucose {
260-
let manualGlucoseSample = NewGlucoseSample(date: saveDate, quantity: glucose, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: UUID().uuidString)
260+
let manualGlucoseSample = NewGlucoseSample(date: saveDate,
261+
quantity: glucose,
262+
trend: nil, // All manual glucose entries are assumed to have no trend.
263+
isDisplayOnly: false,
264+
wasUserEntered: true,
265+
syncIdentifier: UUID().uuidString)
261266
delegate.addGlucose([manualGlucoseSample]) { error in
262267
DispatchQueue.main.async {
263268
if let error = error {

LoopTests/Managers/CGMStalenessMonitorTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class CGMStalenessMonitorTests: XCTestCase {
1818
private var fetchExpectation: XCTestExpectation?
1919

2020
private var storedGlucoseSample: StoredGlucoseSample {
21-
return StoredGlucoseSample(uuid: UUID(), provenanceIdentifier: UUID().uuidString, syncIdentifier: "syncIdentifier", syncVersion: 1, startDate: Date().addingTimeInterval(-.minutes(5)), quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), isDisplayOnly: false, wasUserEntered: false, device: nil)
21+
return StoredGlucoseSample(uuid: UUID(), provenanceIdentifier: UUID().uuidString, syncIdentifier: "syncIdentifier", syncVersion: 1, startDate: Date().addingTimeInterval(-.minutes(5)), quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), trend: .flat, isDisplayOnly: false, wasUserEntered: false, device: nil)
2222
}
2323

2424
private var newGlucoseSample: NewGlucoseSample {
25-
return NewGlucoseSample(date: Date().addingTimeInterval(-.minutes(1)), quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), isDisplayOnly: false, wasUserEntered: false, syncIdentifier: "syncIdentifier")
25+
return NewGlucoseSample(date: Date().addingTimeInterval(-.minutes(1)), quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 120), trend: .flat, isDisplayOnly: false, wasUserEntered: false, syncIdentifier: "syncIdentifier")
2626
}
2727

2828
func testInitialValue() {

LoopTests/Models/WatchHistoricalGlucoseTest.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class WatchHistoricalGlucoseTests: XCTestCase {
2121
syncVersion: 4,
2222
startDate: Date(timeIntervalSinceReferenceDate: .hours(100)),
2323
quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 123.45),
24+
trend: nil,
2425
isDisplayOnly: false,
2526
wasUserEntered: true,
2627
device: device),
@@ -30,6 +31,7 @@ class WatchHistoricalGlucoseTests: XCTestCase {
3031
syncVersion: 2,
3132
startDate: Date(timeIntervalSinceReferenceDate: .hours(99)),
3233
quantity: HKQuantity(unit: .millimolesPerLiter, doubleValue: 7.2),
34+
trend: .up,
3335
isDisplayOnly: true,
3436
wasUserEntered: false,
3537
device: device),
@@ -39,6 +41,7 @@ class WatchHistoricalGlucoseTests: XCTestCase {
3941
syncVersion: nil,
4042
startDate: Date(timeIntervalSinceReferenceDate: .hours(98)),
4143
quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 187.65),
44+
trend: .downDownDown,
4245
isDisplayOnly: false,
4346
wasUserEntered: false,
4447
device: nil),

LoopTests/ViewModels/BolusEntryViewModelTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ class BolusEntryViewModelTests: XCTestCase {
477477

478478
try saveAndDeliver(BolusEntryViewModelTests.noBolus)
479479

480-
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
480+
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, trend: nil, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
481481
XCTAssertEqual([expectedGlucoseSample], delegate.glucoseSamplesAdded)
482482

483483
delegate.addGlucoseCompletion?(.success([Self.exampleManualStoredGlucoseSample]))
@@ -532,7 +532,7 @@ class BolusEntryViewModelTests: XCTestCase {
532532

533533
try saveAndDeliver(BolusEntryViewModelTests.exampleBolusQuantity)
534534

535-
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
535+
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, trend: nil, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
536536
XCTAssertEqual([expectedGlucoseSample], delegate.glucoseSamplesAdded)
537537

538538
delegate.addGlucoseCompletion?(.success([Self.exampleManualStoredGlucoseSample]))
@@ -622,7 +622,7 @@ class BolusEntryViewModelTests: XCTestCase {
622622

623623
try saveAndDeliver(BolusEntryViewModelTests.exampleBolusQuantity)
624624

625-
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
625+
let expectedGlucoseSample = NewGlucoseSample(date: now, quantity: Self.exampleManualGlucoseQuantity, trend: nil, isDisplayOnly: false, wasUserEntered: true, syncIdentifier: mockUUID)
626626
XCTAssertEqual([expectedGlucoseSample], delegate.glucoseSamplesAdded)
627627

628628
delegate.addGlucoseCompletion?(.success([Self.exampleManualStoredGlucoseSample]))

0 commit comments

Comments
 (0)