Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v1.2.0 #336

Merged
merged 47 commits into from
Dec 24, 2016
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
8380bc1
Added BatteryChemistry Selection
jlucasvt Nov 15, 2016
21c9768
Added Battery Calculation
jlucasvt Nov 15, 2016
5b60c34
Descriptions and Syntax Corrections #141
jlucasvt Nov 15, 2016
23ca6f9
Update NightscoutService.swift
hilarykoch Nov 17, 2016
60c57ab
Merge pull request #263 from hilarykoch/patch-1
ps2 Nov 18, 2016
eb9481d
Merge pull request #272 from LoopKit/master
ps2 Nov 22, 2016
652fec9
Adding italian translations
ps2 Nov 22, 2016
1e2bf57
Merge branch 'dev-1.1.1-x22BatteryStatus' of https://github.com/jluca…
ps2 Nov 22, 2016
969da0c
dynamically compute battery percent, observe both types of battery up…
ps2 Nov 22, 2016
9bffe97
Use 0-1 range instead of percent for battery level, remove unused code
ps2 Nov 22, 2016
ca8f483
Fix battery monitoring to use 0-1 range
ps2 Nov 22, 2016
22640cf
Update wording and timespan for lithium description.
ps2 Nov 22, 2016
3e33c1f
Use BatteryChemistryType from MinimedKit
ps2 Nov 24, 2016
884831a
Merge pull request #275 from LoopKit/x22-battery-pct
ps2 Nov 24, 2016
fe667c7
Remove unused translation files, and avoid translating CFBundleName
ps2 Nov 24, 2016
ca54f3e
Merge pull request #274 from LoopKit/translation-it
ps2 Nov 24, 2016
678734b
Move GlucoseTrend model from WatchApp Extension into Loop.
Nov 27, 2016
4bc2636
Merge pull request #1 from LoopKit/dev
Dec 1, 2016
5710778
Clicking Recommended copies values down! Closes #286
shanselman Dec 1, 2016
c85759a
Update rl frameworks to 0.12.9 to get alkaline battery chemistry changes
ps2 Dec 1, 2016
8cccdb0
Merge pull request #282 from bharat/issue_280
ps2 Dec 1, 2016
689b0f6
Merge pull request #290 from LoopKit/update-rl-frameworks-for-battery
ps2 Dec 1, 2016
cc098c4
Reverting UI change to Bolus Wizard
shanselman Dec 1, 2016
89dd06b
Merge remote-tracking branch 'upstream/dev' into dev
Dec 1, 2016
2032250
VoiceOver/Accessibilty for Recommended Bolus ProUser trick
shanselman Dec 1, 2016
40ac411
Turn on "Missing Localizability" - XCode suggested fix.
Dec 2, 2016
a7ed6bf
Merge pull request #296 from bharat/issue_295
ps2 Dec 2, 2016
7f2d857
Merge pull request #288 from shanselman/RecommendedBolusPR
ps2 Dec 2, 2016
4c5e32c
Remove default value for allowPredictiveTempBelowRange (#297)
Dec 2, 2016
25ab3e8
Update osx_image to xcode8.1 to get Swift 3.0.1
Dec 2, 2016
370bea1
Merge pull request #302 from bharat/issue_301
ps2 Dec 4, 2016
d3542e1
Bump version
ps2 Dec 9, 2016
d4bdf59
If minBG is below 55, then shut off basal, even if eventualBG is in r…
ps2 Dec 9, 2016
8e62c42
Create a lock screen widget (aka Today Extension) (#281)
Dec 10, 2016
282ac69
Merge pull request #310 from LoopKit/hard-cutoff-for-low-bg
ps2 Dec 10, 2016
d8ce03f
Merge pull request #309 from LoopKit/bump-version
ps2 Dec 10, 2016
55576cf
Update bundle identifier to com.loopkit
ps2 Dec 11, 2016
9808a28
adding CustomDebugStringConvertible support for the new manager/state…
ps2 Dec 11, 2016
042ed70
Merge pull request #313 from LoopKit/update-bundle-identifier
ps2 Dec 11, 2016
e0af02f
Fix the sourceTree for the Loop Status Extension storyboard.
Dec 11, 2016
5838f6d
Properly support mmol/L in the status extension.
Dec 11, 2016
bde902e
Reverse two logical checks for clarity.
Dec 12, 2016
50214d4
Merge pull request #316 from bharat/issue_311
ps2 Dec 12, 2016
c4cd1dd
Merge pull request #314 from LoopKit/custom-debugstring-for-status-ex…
ps2 Dec 12, 2016
b897bef
Merge pull request #315 from bharat/fix-xcode-proj
ps2 Dec 12, 2016
3027fda
Change how app group id is constructed to avoid conflict with acciden…
ps2 Dec 12, 2016
73b7302
Merge pull request #318 from LoopKit/fix-nates-build
ps2 Dec 24, 2016
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
161 changes: 40 additions & 121 deletions DoseMathTests/DoseMathTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand All @@ -113,8 +112,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand All @@ -134,8 +132,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0, dose!.rate)
Expand All @@ -151,21 +148,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
)

XCTAssertEqual(0, dose!.rate)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)

dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand All @@ -184,8 +167,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0, dose!.rate)
Expand All @@ -195,83 +177,26 @@ class RecommendTempBasalTests: XCTestCase {
func testCorrectLowAtMin() {
let glucose = loadGlucoseValueFixture("recommend_temp_basal_correct_low_at_min")

var dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
)

XCTAssertEqualWithAccuracy(0.125, dose!.rate, accuracy: 1.0 / 40.0)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)

// Ignore due to existing dose
var lastTempBasal = DoseEntry(
type: .tempBasal,
startDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: -11)),
endDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: 19)),
value: 0.125,
unit: .unitsPerHour
)

dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: lastTempBasal,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
)

XCTAssertNil(dose)

// Cancel existing dose
lastTempBasal = DoseEntry(
type: .tempBasal,
startDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: -11)),
endDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: 19)),
value: 1.225,
unit: .unitsPerHour
)

dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: lastTempBasal,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
)

XCTAssertEqualWithAccuracy(0.125, dose!.rate, accuracy: 1.0 / 40.0)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)

// Continue existing dose
lastTempBasal = DoseEntry(
var lastTempBasal = DoseEntry(
type: .tempBasal,
startDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: -21)),
endDate: glucose.first!.startDate.addingTimeInterval(TimeInterval(minutes: 9)),
value: 0.125,
unit: .unitsPerHour
)

dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
var dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: lastTempBasal,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqualWithAccuracy(0.125, dose!.rate, accuracy: 1.0 / 40.0)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
XCTAssertEqual(0, dose!.rate)
XCTAssertEqual(TimeInterval(minutes: 0), dose!.duration)

// Allow predictive temp below range
dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
Expand All @@ -280,8 +205,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand All @@ -300,8 +224,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0, dose!.rate)
Expand All @@ -317,8 +240,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0, dose!.rate)
Expand All @@ -328,28 +250,14 @@ class RecommendTempBasalTests: XCTestCase {
func testStartLowEndHigh() {
let glucose = loadGlucoseValueFixture("recommend_temp_basal_start_low_end_high")

var dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
)

XCTAssertEqual(0, dose!.rate)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)

// Allow predictive temp below range
dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
var dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand All @@ -368,8 +276,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0, dose!.rate)
Expand All @@ -385,8 +292,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(3.0, dose!.rate)
Expand All @@ -402,8 +308,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqualWithAccuracy(1.425, dose!.rate, accuracy: 1.0 / 40.0)
Expand All @@ -419,8 +324,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqualWithAccuracy(1.475, dose!.rate, accuracy: 1.0 / 40.0)
Expand All @@ -436,8 +340,7 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: self.insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(3.0, dose!.rate)
Expand All @@ -452,22 +355,37 @@ class RecommendTempBasalTests: XCTestCase {
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertEqualWithAccuracy(2.975, dose!.rate, accuracy: 1.0 / 40.0)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
}

func testVeryLowAndRising() {
let glucose = loadGlucoseValueFixture("recommend_tamp_basal_very_low_end_in_range")

let dose = DoseMath.recommendTempBasalFromPredictedGlucose(glucose,
atDate: glucose.first!.startDate,
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: self.insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule
)

XCTAssertEqual(0.0, dose!.rate)
XCTAssertEqual(TimeInterval(minutes: 30), dose!.duration)
}


func testNoInputGlucose() {
let dose = DoseMath.recommendTempBasalFromPredictedGlucose([],
lastTempBasal: nil,
maxBasalRate: maxBasalRate,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivitySchedule,
basalRateSchedule: basalRateSchedule,
allowPredictiveTempBelowRange: false
basalRateSchedule: basalRateSchedule
)

XCTAssertNil(dose)
Expand Down Expand Up @@ -728,4 +646,5 @@ class RecommendBolusTests: XCTestCase {

XCTAssertEqual(0, dose)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[
{"date": "2015-07-19T18:00:00", "amount": 60},
{"date": "2015-07-19T18:30:00", "amount": 50},
{"date": "2015-07-19T19:00:00", "amount": 60},
{"date": "2015-07-19T19:30:00", "amount": 70},
{"date": "2015-07-19T20:00:00", "amount": 100}
]
4 changes: 4 additions & 0 deletions Loop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@
4FC8C8011DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; };
4FC8C8021DEB943800A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; };
C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */; };
C12F21A71DFA79CB00748193 /* recommend_tamp_basal_very_low_end_in_range.json in Resources */ = {isa = PBXBuildFile; fileRef = C12F21A61DFA79CB00748193 /* recommend_tamp_basal_very_low_end_in_range.json */; };
C15713821DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15713811DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift */; };
C17884631D51A7A400405663 /* BatteryIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17884621D51A7A400405663 /* BatteryIndicator.swift */; };
C18C8C511D5A351900E043FB /* NightscoutDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18C8C501D5A351900E043FB /* NightscoutDataManager.swift */; };
Expand Down Expand Up @@ -448,6 +449,7 @@
4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusExtensionContext.swift; sourceTree = "<group>"; };
4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSUserDefaults+StatusExtension.swift"; sourceTree = "<group>"; };
C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NightscoutUploadKit.framework; path = Carthage/Build/iOS/NightscoutUploadKit.framework; sourceTree = "<group>"; };
C12F21A61DFA79CB00748193 /* recommend_tamp_basal_very_low_end_in_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_tamp_basal_very_low_end_in_range.json; sourceTree = "<group>"; };
C15713811DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MealBolusNightscoutTreatment.swift; sourceTree = "<group>"; };
C17884621D51A7A400405663 /* BatteryIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatteryIndicator.swift; sourceTree = "<group>"; };
C18C8C501D5A351900E043FB /* NightscoutDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutDataManager.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -701,6 +703,7 @@
43E2D8E91D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json */,
43E2D8EA1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json */,
43E2D8EB1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json */,
C12F21A61DFA79CB00748193 /* recommend_tamp_basal_very_low_end_in_range.json */,
);
path = Fixtures;
sourceTree = "<group>";
Expand Down Expand Up @@ -1102,6 +1105,7 @@
43E2D8EF1D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json in Resources */,
43E2D8ED1D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json in Resources */,
43E2D8F01D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json in Resources */,
C12F21A71DFA79CB00748193 /* recommend_tamp_basal_very_low_end_in_range.json in Resources */,
43E2D8F11D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json in Resources */,
43E2D8EE1D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json in Resources */,
43E2D8F31D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json in Resources */,
Expand Down
10 changes: 6 additions & 4 deletions Loop/Managers/DoseMath.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ struct DoseMath {
- parameter glucoseTargetRange: The schedule of target glucose ranges
- parameter insulinSensitivity: The schedule of insulin sensitivities, in Units of insulin per glucose-unit
- parameter basalRateSchedule: The schedule of basal rates
- parameter allowPredictiveTempBelowRange: Whether to allow a higher basal rate, up to the normal scheduled rate, than is necessary to correct the lowest predicted value, if the eventual predicted value is in or above the target range. Defaults to false.

- returns: The recommended basal rate and duration
*/
Expand All @@ -61,8 +60,7 @@ struct DoseMath {
maxBasalRate: Double,
glucoseTargetRange: GlucoseRangeSchedule,
insulinSensitivity: InsulinSensitivitySchedule,
basalRateSchedule: BasalRateSchedule,
allowPredictiveTempBelowRange: Bool
basalRateSchedule: BasalRateSchedule
) -> (rate: Double, duration: TimeInterval)? {
guard glucose.count > 1 else {
return nil
Expand All @@ -79,7 +77,11 @@ struct DoseMath {
var rate: Double?
var duration = TimeInterval(minutes: 30)

if minGlucose.quantity.doubleValue(for: glucoseTargetRange.unit) < minGlucoseTargets.minValue && (!allowPredictiveTempBelowRange || eventualGlucose.quantity.doubleValue(for: glucoseTargetRange.unit) <= eventualGlucoseTargets.minValue) {
let alwaysLowTempBGThreshold: Double = 55 // mg/dL

if minGlucose.quantity.doubleValue(for: HKUnit.milligramsPerDeciliterUnit()) <= alwaysLowTempBGThreshold {
rate = 0
} else if minGlucose.quantity.doubleValue(for: glucoseTargetRange.unit) < minGlucoseTargets.minValue && eventualGlucose.quantity.doubleValue(for: glucoseTargetRange.unit) <= eventualGlucoseTargets.minValue {
let targetGlucose = HKQuantity(unit: glucoseTargetRange.unit, doubleValue: (minGlucoseTargets.minValue + minGlucoseTargets.maxValue) / 2)
rate = calculateTempBasalRateForGlucose(minGlucose.quantity,
toTargetGlucose: targetGlucose,
Expand Down
3 changes: 1 addition & 2 deletions Loop/Managers/LoopDataManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -559,8 +559,7 @@ final class LoopDataManager {
maxBasalRate: maxBasal,
glucoseTargetRange: glucoseTargetRange,
insulinSensitivity: insulinSensitivity,
basalRateSchedule: basalRates,
allowPredictiveTempBelowRange: true
basalRateSchedule: basalRates
)
else {
recommendedTempBasal = nil
Expand Down