Skip to content

Commit

Permalink
Parse prediction and effects
Browse files Browse the repository at this point in the history
  • Loading branch information
ps2 committed Oct 27, 2024
1 parent f4e992d commit 73caad0
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 11 deletions.
27 changes: 27 additions & 0 deletions Sources/LoopIssueReportParser/Parsers/GlucoseEffectParser.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// GlucoseEffectParser.swift
// LoopIssueReportParser
//
// Created by Pete Schwamb on 10/27/24.
//

import Foundation
import Parsing
import HealthKit
import LoopAlgorithm

public struct GlucoseEffectParser: Parser {

public var body: some Parser<Substring, GlucoseEffect> {
Parse {
"* "
DebugDateParser() // startDate
", "
Double.parser() // glucose value
}.map {
GlucoseEffect(startDate: $0.0, quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: $0.1))
}
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// GlucoseEffectVelocityParser.swift
// LoopIssueReportParser
//
// Created by Pete Schwamb on 10/27/24.
//

import Foundation
import Parsing
import HealthKit
import LoopAlgorithm

public struct GlucoseEffectVelocityParser: Parser {

public var body: some Parser<Substring, GlucoseEffectVelocity> {
Parse {
"* "
DebugDateParser() // startDate
", "
DebugDateParser() // endDate
", "
Double.parser() // velocity
}.map {
GlucoseEffectVelocity(startDate: $0.0, endDate: $0.1, quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: $0.2))
}
}
}


69 changes: 59 additions & 10 deletions Sources/LoopIssueReportParser/Parsers/IssueReportParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,17 @@
import HealthKit
import Parsing
import LoopKit
import LoopAlgorithm

public struct IssueReport {
public let generatedAt: Date
public let buildDetails: BuildDetails
public let deviceLogs: [DeviceCommunicationLogEntry]
public let loopSettings: LoopSettings
public let insulinCounteractionEffects: [GlucoseEffectVelocity]
public let insulinEffect: [GlucoseEffect]
public let carbEffect: [GlucoseEffect]
public let predictedGlucose: [SimpleGlucoseValue]
public let cachedGlucoseSamples: [StoredGlucoseSample]
public let cachedCarbEntries: [StoredCarbEntry]
public let pumpEvents: [PersistedPumpEvent]
Expand Down Expand Up @@ -54,6 +59,46 @@ public struct IssueReportParser: Parser {
LoopSettingsParser()
}
Whitespace(.vertical)
"insulinCounteractionEffects: ["
Whitespace(.vertical)
"* GlucoseEffectVelocity(start, end, mg/dL/min)"
Whitespace(.vertical)
Many {
GlucoseEffectVelocityParser()
} separator: {
Whitespace(.vertical)
}
Skip { PrefixUpTo("insulinEffect: [") }
"insulinEffect: ["
Whitespace(.vertical)
"* GlucoseEffect(start, mg/dL)"
Whitespace(.vertical)
Many {
GlucoseEffectParser()
} separator: {
Whitespace(.vertical)
}
Skip { PrefixUpTo("carbEffect: [") }
"carbEffect: ["
Whitespace(.vertical)
"* GlucoseEffect(start, mg/dL)"
Whitespace(.vertical)
Many {
GlucoseEffectParser()
} separator: {
Whitespace(.vertical)
}
Skip { PrefixUpTo("predictedGlucose: [") }
"predictedGlucose: ["
Whitespace(.vertical)
"* PredictedGlucoseValue(start, mg/dL)"
Whitespace(.vertical)
Many {
PredictedGlucoseParser()
} separator: {
Whitespace(.vertical)
}
Whitespace(.vertical)
Skip { PrefixUpTo("### cachedGlucoseSamples") }
"### cachedGlucoseSamples"
Whitespace(.vertical)
Expand Down Expand Up @@ -115,16 +160,20 @@ public struct IssueReportParser: Parser {
}
return p.map { value in
IssueReport(
generatedAt: value.0,
buildDetails: value.1,
deviceLogs: value.2 ?? [],
loopSettings: value.3,
cachedGlucoseSamples: value.4,
cachedCarbEntries: value.5,
pumpEvents: value.6,
normalizedDoseEntries: value.7,
entriesForSavingToInsulinDeliveryStore: value.8,
cachedDoseEntries: value.9
generatedAt: value.0.0,
buildDetails: value.0.1,
deviceLogs: value.0.2 ?? [],
loopSettings: value.0.3,
insulinCounteractionEffects: value.0.4,
insulinEffect: value.0.5,
carbEffect: value.0.6,
predictedGlucose: value.0.7,
cachedGlucoseSamples: value.0.8,
cachedCarbEntries: value.0.9,
pumpEvents: value.1,
normalizedDoseEntries: value.2,
entriesForSavingToInsulinDeliveryStore: value.3,
cachedDoseEntries: value.4
)
}
}
Expand Down
27 changes: 27 additions & 0 deletions Sources/LoopIssueReportParser/Parsers/PredictedGlucoseParser.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// PredictedGlucoseParser.swift
// LoopIssueReportParser
//
// Created by Pete Schwamb on 10/27/24.
//

import Foundation
import Parsing
import HealthKit
import LoopAlgorithm

public struct PredictedGlucoseParser: Parser {

public var body: some Parser<Substring, SimpleGlucoseValue> {
Parse {
"* "
DebugDateParser() // startDate
", "
Double.parser() // glucose value
}.map {
SimpleGlucoseValue(startDate: $0.0, quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: $0.1))
}
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,12 @@ final class LoopIssueReportParserTests: XCTestCase {
XCTAssertEqual(issueReport.loopSettings.insulinSensitivitySchedule?.items.count, 1)
XCTAssertEqual(issueReport.loopSettings.maximumBolus, 7.0)

let suspendThreshold = issueReport.loopSettings.suspendThreshold!.quantity
XCTAssertEqual(issueReport.insulinCounteractionEffects.count, 248)
XCTAssertEqual(issueReport.insulinEffect.count, 344)
XCTAssertEqual(issueReport.carbEffect.count, 1)
XCTAssertEqual(issueReport.predictedGlucose.count, 56)

let suspendThreshold = issueReport.loopSettings.suspendThreshold!
XCTAssertEqual(suspendThreshold.doubleValue(for: .milligramsPerDeciliter), 80, accuracy: 0.01)

XCTAssertEqual(issueReport.loopSettings.automaticDosingStrategy, .tempBasalOnly)
Expand Down

0 comments on commit 73caad0

Please sign in to comment.