Skip to content

Commit 1b81466

Browse files
authored
Limit bolus using suspend threshold. (#568)
* Only recommend bolus that would not bring forecast below range. * Xcode 8.3 fix * Revert inadvertent spacing changes * Compute the target value as a function of time since the dose started
1 parent 34d670f commit 1b81466

15 files changed

+798
-587
lines changed

DoseMathTests/DoseMathTests.swift

Lines changed: 296 additions & 341 deletions
Large diffs are not rendered by default.
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 90},
3-
{"date": "2015-07-19T18:30:00", "amount": 80},
4-
{"date": "2015-07-19T19:00:00", "amount": 100},
5-
{"date": "2015-07-19T19:30:00", "amount": 160},
6-
{"date": "2015-07-19T20:00:00", "amount": 200}
3+
{"date": "2015-07-19T19:00:00", "amount": 80},
4+
{"date": "2015-07-19T20:00:00", "amount": 100},
5+
{"date": "2015-07-19T21:00:00", "amount": 160},
6+
{"date": "2015-07-19T22:00:00", "amount": 200}
77
]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 200},
3-
{"date": "2015-07-19T18:30:00", "amount": 200},
4-
]
3+
{"date": "2015-07-19T22:00:00", "amount": 200},
4+
]
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 240},
3-
{"date": "2015-07-19T18:30:00", "amount": 220},
4-
{"date": "2015-07-19T19:00:00", "amount": 200},
5-
{"date": "2015-07-19T19:30:00", "amount": 160},
6-
{"date": "2015-07-19T20:00:00", "amount": 124}
7-
]
3+
{"date": "2015-07-19T19:00:00", "amount": 220},
4+
{"date": "2015-07-19T20:00:00", "amount": 200},
5+
{"date": "2015-07-19T21:00:00", "amount": 160},
6+
{"date": "2015-07-19T22:00:00", "amount": 124}
7+
]
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 140},
3-
{"date": "2015-07-19T18:30:00", "amount": 150},
4-
{"date": "2015-07-19T19:00:00", "amount": 160},
5-
{"date": "2015-07-19T19:30:00", "amount": 170},
6-
{"date": "2015-07-19T20:00:00", "amount": 180}
7-
]
3+
{"date": "2015-07-19T19:00:00", "amount": 150},
4+
{"date": "2015-07-19T20:00:00", "amount": 160},
5+
{"date": "2015-07-19T21:00:00", "amount": 170},
6+
{"date": "2015-07-19T22:00:00", "amount": 180}
7+
]
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 90},
3-
{"date": "2015-07-19T18:30:00", "amount": 100},
4-
{"date": "2015-07-19T19:00:00", "amount": 110},
5-
{"date": "2015-07-19T19:30:00", "amount": 120},
6-
{"date": "2015-07-19T20:00:00", "amount": 125}
7-
]
3+
{"date": "2015-07-19T19:00:00", "amount": 100},
4+
{"date": "2015-07-19T20:00:00", "amount": 110},
5+
{"date": "2015-07-19T21:00:00", "amount": 120},
6+
{"date": "2015-07-19T22:00:00", "amount": 125}
7+
]
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{"date": "2015-07-19T18:00:00", "amount": 60},
3-
{"date": "2015-07-19T18:30:00", "amount": 80},
4-
{"date": "2015-07-19T19:00:00", "amount": 120},
5-
{"date": "2015-07-19T19:30:00", "amount": 160},
6-
{"date": "2015-07-19T20:00:00", "amount": 200}
7-
]
3+
{"date": "2015-07-19T19:00:00", "amount": 80},
4+
{"date": "2015-07-19T20:00:00", "amount": 120},
5+
{"date": "2015-07-19T21:00:00", "amount": 160},
6+
{"date": "2015-07-19T22:00:00", "amount": 200}
7+
]

Loop.xcodeproj/project.pbxproj

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
438A95A81D8B9B24009D12E1 /* xDripG5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 438A95A71D8B9B24009D12E1 /* xDripG5.framework */; };
8888
438D42F91D7C88BC003244B0 /* PredictionInputEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438D42F81D7C88BC003244B0 /* PredictionInputEffect.swift */; };
8989
438D42FB1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438D42FA1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift */; };
90+
43947D731F529FAA00A07D31 /* GlucoseRangeSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */; };
9091
439897371CD2F80600223065 /* AnalyticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897361CD2F80600223065 /* AnalyticsManager.swift */; };
9192
4398973B1CD2FC2000223065 /* NSDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4398973A1CD2FC2000223065 /* NSDateFormatter.swift */; };
9293
439BED2A1E76093C00B0AED5 /* CGMManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439BED291E76093C00B0AED5 /* CGMManager.swift */; };
@@ -1281,7 +1282,7 @@
12811282
isa = PBXProject;
12821283
attributes = {
12831284
LastSwiftUpdateCheck = 0730;
1284-
LastUpgradeCheck = 0820;
1285+
LastUpgradeCheck = 0820;
12851286
ORGANIZATIONNAME = "LoopKit Authors";
12861287
TargetAttributes = {
12871288
43776F8B1B8022E90074EA36 = {
@@ -1502,7 +1503,7 @@
15021503
);
15031504
runOnlyForDeploymentPostprocessing = 0;
15041505
shellPath = /bin/sh;
1505-
shellScript = "# /usr/local/bin/carthage build --platform \"$PLATFORM_NAME\" \"$SRCROOT\"\n# Only run this script if we're not using a workspace or installing\nif [ ! -d $PROJECT_DIR/Loop.xcworkspace ] || [ \"$ACTION\" = \"install\" ]; then\n /usr/local/bin/carthage copy-frameworks\nfi";
1506+
shellScript = "# /usr/local/bin/carthage build --platform \"$PLATFORM_NAME\" \"$SRCROOT\"\n# Only run this script if we're not using a workspace or installing\nif [ ! -d $PROJECT_DIR/Loop.xcworkspace ] || [ \"$ACTION\" = \"install\" ]; then\n /usr/local/bin/carthage copy-frameworks\nfi";
15061507
};
15071508
/* End PBXShellScriptBuildPhase section */
15081509

@@ -1663,6 +1664,7 @@
16631664
buildActionMask = 2147483647;
16641665
files = (
16651666
C17824A11E19E8C200D9D25C /* GlucoseThreshold.swift in Sources */,
1667+
43947D731F529FAA00A07D31 /* GlucoseRangeSchedule.swift in Sources */,
16661668
43E2D8DC1D20C049004DA55F /* DoseMath.swift in Sources */,
16671669
43E2D8DB1D20C03B004DA55F /* NSTimeInterval.swift in Sources */,
16681670
43E2D8D41D20BF42004DA55F /* DoseMathTests.swift in Sources */,
@@ -1842,7 +1844,7 @@
18421844
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
18431845
CODE_SIGN_IDENTITY = "iPhone Developer: [email protected] (XZN842LDLT)";
18441846
COPY_PHASE_STRIP = NO;
1845-
CURRENT_PROJECT_VERSION = 39;
1847+
CURRENT_PROJECT_VERSION = 39;
18461848
DEBUG_INFORMATION_FORMAT = dwarf;
18471849
ENABLE_STRICT_OBJC_MSGSEND = YES;
18481850
ENABLE_TESTABILITY = YES;
@@ -1870,7 +1872,7 @@
18701872
ONLY_ACTIVE_ARCH = YES;
18711873
SDKROOT = iphoneos;
18721874
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
1873-
SWIFT_VERSION = 3.0.1;
1875+
SWIFT_VERSION = 3.0.1;
18741876
TARGETED_DEVICE_FAMILY = "1,2";
18751877
WARNING_CFLAGS = "-Wall";
18761878
};
@@ -1900,7 +1902,7 @@
19001902
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
19011903
CODE_SIGN_IDENTITY = "iPhone Developer: [email protected] (XZN842LDLT)";
19021904
COPY_PHASE_STRIP = NO;
1903-
CURRENT_PROJECT_VERSION = 39;
1905+
CURRENT_PROJECT_VERSION = 39;
19041906
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
19051907
ENABLE_NS_ASSERTIONS = NO;
19061908
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1921,7 +1923,7 @@
19211923
MTL_ENABLE_DEBUG_INFO = NO;
19221924
SDKROOT = iphoneos;
19231925
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
1924-
SWIFT_VERSION = 3.0.1;
1926+
SWIFT_VERSION = 3.0.1;
19251927
TARGETED_DEVICE_FAMILY = "1,2";
19261928
VALIDATE_PRODUCT = YES;
19271929
WARNING_CFLAGS = "-Wall";
@@ -1935,7 +1937,7 @@
19351937
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
19361938
CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements;
19371939
CODE_SIGN_IDENTITY = "iPhone Developer";
1938-
DEVELOPMENT_TEAM = "";
1940+
DEVELOPMENT_TEAM = "";
19391941
INFOPLIST_FILE = Loop/Info.plist;
19401942
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
19411943
"OTHER_SWIFT_FLAGS[sdk=iphonesimulator*]" = "-D IOS_SIMULATOR";
@@ -1952,7 +1954,7 @@
19521954
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
19531955
CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements;
19541956
CODE_SIGN_IDENTITY = "iPhone Developer";
1955-
DEVELOPMENT_TEAM = "";
1957+
DEVELOPMENT_TEAM = "";
19561958
INFOPLIST_FILE = Loop/Info.plist;
19571959
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
19581960
PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER)";
@@ -1967,7 +1969,7 @@
19671969
ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
19681970
CODE_SIGN_IDENTITY = "iPhone Developer";
19691971
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
1970-
DEVELOPMENT_TEAM = "";
1972+
DEVELOPMENT_TEAM = "";
19711973
INFOPLIST_FILE = "WatchApp Extension/Info.plist";
19721974
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
19731975
PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).watchkitapp.watchkitextension";
@@ -1985,7 +1987,7 @@
19851987
ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
19861988
CODE_SIGN_IDENTITY = "iPhone Developer";
19871989
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
1988-
DEVELOPMENT_TEAM = "";
1990+
DEVELOPMENT_TEAM = "";
19891991
INFOPLIST_FILE = "WatchApp Extension/Info.plist";
19901992
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
19911993
PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).watchkitapp.watchkitextension";
@@ -2004,7 +2006,7 @@
20042006
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
20052007
CODE_SIGN_IDENTITY = "iPhone Developer";
20062008
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
2007-
DEVELOPMENT_TEAM = "";
2009+
DEVELOPMENT_TEAM = "";
20082010
IBSC_MODULE = WatchApp_Extension;
20092011
INFOPLIST_FILE = WatchApp/Info.plist;
20102012
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@@ -2024,7 +2026,7 @@
20242026
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
20252027
CODE_SIGN_IDENTITY = "iPhone Developer";
20262028
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer";
2027-
DEVELOPMENT_TEAM = "";
2029+
DEVELOPMENT_TEAM = "";
20282030
IBSC_MODULE = WatchApp_Extension;
20292031
INFOPLIST_FILE = WatchApp/Info.plist;
20302032
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@@ -2042,7 +2044,7 @@
20422044
buildSettings = {
20432045
CLANG_ANALYZER_NONNULL = YES;
20442046
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2045-
DEVELOPMENT_TEAM = "";
2047+
DEVELOPMENT_TEAM = "";
20462048
INFOPLIST_FILE = DoseMathTests/Info.plist;
20472049
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks";
20482050
PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests;
@@ -2055,7 +2057,7 @@
20552057
buildSettings = {
20562058
CLANG_ANALYZER_NONNULL = YES;
20572059
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2058-
DEVELOPMENT_TEAM = "";
2060+
DEVELOPMENT_TEAM = "";
20592061
INFOPLIST_FILE = DoseMathTests/Info.plist;
20602062
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks";
20612063
PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests;
@@ -2069,7 +2071,7 @@
20692071
BUNDLE_LOADER = "$(TEST_HOST)";
20702072
CLANG_ANALYZER_NONNULL = YES;
20712073
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2072-
DEVELOPMENT_TEAM = "";
2074+
DEVELOPMENT_TEAM = "";
20732075
INFOPLIST_FILE = LoopTests/Info.plist;
20742076
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
20752077
PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests;
@@ -2084,7 +2086,7 @@
20842086
BUNDLE_LOADER = "$(TEST_HOST)";
20852087
CLANG_ANALYZER_NONNULL = YES;
20862088
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2087-
DEVELOPMENT_TEAM = "";
2089+
DEVELOPMENT_TEAM = "";
20882090
INFOPLIST_FILE = LoopTests/Info.plist;
20892091
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
20902092
PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests;
@@ -2102,7 +2104,7 @@
21022104
CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements";
21032105
CODE_SIGN_IDENTITY = "iPhone Developer";
21042106
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2105-
DEVELOPMENT_TEAM = "";
2107+
DEVELOPMENT_TEAM = "";
21062108
INFOPLIST_FILE = "Loop Status Extension/Info.plist";
21072109
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
21082110
PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget";
@@ -2121,7 +2123,7 @@
21212123
CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements";
21222124
CODE_SIGN_IDENTITY = "iPhone Developer";
21232125
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
2124-
DEVELOPMENT_TEAM = "";
2126+
DEVELOPMENT_TEAM = "";
21252127
INFOPLIST_FILE = "Loop Status Extension/Info.plist";
21262128
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
21272129
PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget";
@@ -2139,11 +2141,11 @@
21392141
CLANG_WARN_SUSPICIOUS_MOVES = YES;
21402142
CODE_SIGN_IDENTITY = "";
21412143
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2142-
CURRENT_PROJECT_VERSION = 39;
2144+
CURRENT_PROJECT_VERSION = 39;
21432145
DEFINES_MODULE = YES;
21442146
DEVELOPMENT_TEAM = "";
21452147
DYLIB_COMPATIBILITY_VERSION = 1;
2146-
DYLIB_CURRENT_VERSION = 39;
2148+
DYLIB_CURRENT_VERSION = 39;
21472149
DYLIB_INSTALL_NAME_BASE = "@rpath";
21482150
INFOPLIST_FILE = LoopUI/Info.plist;
21492151
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2166,11 +2168,11 @@
21662168
CLANG_WARN_SUSPICIOUS_MOVES = YES;
21672169
CODE_SIGN_IDENTITY = "";
21682170
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2169-
CURRENT_PROJECT_VERSION = 39;
2171+
CURRENT_PROJECT_VERSION = 39;
21702172
DEFINES_MODULE = YES;
21712173
DEVELOPMENT_TEAM = "";
21722174
DYLIB_COMPATIBILITY_VERSION = 1;
2173-
DYLIB_CURRENT_VERSION = 39;
2175+
DYLIB_CURRENT_VERSION = 39;
21742176
DYLIB_INSTALL_NAME_BASE = "@rpath";
21752177
INFOPLIST_FILE = LoopUI/Info.plist;
21762178
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";

Loop/Extensions/GlucoseRangeSchedule.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import LoopKit
9+
import HealthKit
910

1011

1112
extension GlucoseRangeSchedule {
@@ -21,4 +22,15 @@ extension GlucoseRangeSchedule {
2122

2223
return override.isActive()
2324
}
25+
26+
func minQuantity(at date: Date) -> HKQuantity {
27+
return HKQuantity(unit: unit, doubleValue: value(at: date).minValue)
28+
}
29+
}
30+
31+
32+
extension DoubleRange {
33+
var averageValue: Double {
34+
return (maxValue + minValue) / 2
35+
}
2436
}

0 commit comments

Comments
 (0)