diff --git a/Cartfile b/Cartfile index 4096b3e8cf..c1120eeb4f 100644 --- a/Cartfile +++ b/Cartfile @@ -1,6 +1,6 @@ -github "loudnate/LoopKit" ~> 0.3 +github "loudnate/LoopKit" ~> 0.3.3 github "loudnate/xDripG5" ~> 0.5 github "loudnate/SwiftCharts" "loudnate/naterade" github "mddub/dexcom-share-client-swift" ~> 0.1 -github "ps2/rileylink_ios" ~> 0.4.0 +github "ps2/rileylink_ios" ~> 0.5.0 github "amplitude/Amplitude-iOS" "mpurland-framework" diff --git a/Cartfile.resolved b/Cartfile.resolved index 3ce0db85c3..3c8ad15d58 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,7 +1,7 @@ -github "amplitude/Amplitude-iOS" "cde0140ac1b51f4df2619c105dbde54546c90957" +github "amplitude/Amplitude-iOS" "a3d6720626e72a678489bce83ed9dacadb505dd7" github "loudnate/Crypto" "13fee45175b88629aeabe60b4b4fc3daf86fa0a3" -github "loudnate/LoopKit" "v0.3.2" -github "loudnate/SwiftCharts" "f3e61c6193f3c19ec6b05941cdd1ba031722f461" +github "loudnate/LoopKit" "v0.3.3" +github "loudnate/SwiftCharts" "8671287afb29640f9cffced6521b1098b7aac085" github "mddub/dexcom-share-client-swift" "v0.1.3" github "loudnate/xDripG5" "0.5.0" -github "ps2/rileylink_ios" "v0.4.0" +github "ps2/rileylink_ios" "v0.5.0" diff --git a/Carthage/Build/iOS/AmplitudeFramework.framework/AmplitudeFramework b/Carthage/Build/iOS/AmplitudeFramework.framework/AmplitudeFramework index 2e40fd2648..58675749a5 100755 Binary files a/Carthage/Build/iOS/AmplitudeFramework.framework/AmplitudeFramework and b/Carthage/Build/iOS/AmplitudeFramework.framework/AmplitudeFramework differ diff --git a/Carthage/Build/iOS/AmplitudeFramework.framework/Headers/AmplitudeFramework.h b/Carthage/Build/iOS/AmplitudeFramework.framework/Headers/AmplitudeFramework.h index 40a3a78af0..23823f4e7c 100644 --- a/Carthage/Build/iOS/AmplitudeFramework.framework/Headers/AmplitudeFramework.h +++ b/Carthage/Build/iOS/AmplitudeFramework.framework/Headers/AmplitudeFramework.h @@ -19,4 +19,6 @@ FOUNDATION_EXPORT const unsigned char AmplitudeFrameworkVersionString[]; #import #import #import - +#import +#import +#import diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit b/Carthage/Build/iOS/CarbKit.framework/CarbKit index fcd71a44b5..ee74f739b9 100755 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit and b/Carthage/Build/iOS/CarbKit.framework/CarbKit differ diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib index 1f143b0fe0..97f2fd22bd 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/CarbEntryEditViewController.nib differ diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib index e9197b1751..d95a9d51d9 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/LyL-9U-twn-view-9Ci-XW-6nA.nib differ diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib index 639fe97191..a7c9e3ff94 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UINavigationController-wgu-gT-TgV.nib differ diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UITableViewController-rUL-yg-cFX.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UITableViewController-rUL-yg-cFX.nib index 8f0c5d4a97..f40af8c758 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UITableViewController-rUL-yg-cFX.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/UITableViewController-rUL-yg-cFX.nib differ diff --git a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib index 7d7254c216..dead298568 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib and b/Carthage/Build/iOS/CarbKit.framework/CarbKit.storyboardc/rUL-yg-cFX-view-b1s-8o-0Wp.nib differ diff --git a/Carthage/Build/iOS/CarbKit.framework/Info.plist b/Carthage/Build/iOS/CarbKit.framework/Info.plist index ae255cdb43..5166bba50b 100644 Binary files a/Carthage/Build/iOS/CarbKit.framework/Info.plist and b/Carthage/Build/iOS/CarbKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/CommonCrypto.framework/CommonCrypto b/Carthage/Build/iOS/CommonCrypto.framework/CommonCrypto index bf9c0d2a1c..72567b3750 100755 Binary files a/Carthage/Build/iOS/CommonCrypto.framework/CommonCrypto and b/Carthage/Build/iOS/CommonCrypto.framework/CommonCrypto differ diff --git a/Carthage/Build/iOS/Crypto.framework/Crypto b/Carthage/Build/iOS/Crypto.framework/Crypto index f15918e6ea..0426bef79c 100755 Binary files a/Carthage/Build/iOS/Crypto.framework/Crypto and b/Carthage/Build/iOS/Crypto.framework/Crypto differ diff --git a/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit b/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit index 358dcfa329..9a9c05d302 100755 Binary files a/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit and b/Carthage/Build/iOS/GlucoseKit.framework/GlucoseKit differ diff --git a/Carthage/Build/iOS/GlucoseKit.framework/Info.plist b/Carthage/Build/iOS/GlucoseKit.framework/Info.plist index 4978c647c7..311cce67b5 100644 Binary files a/Carthage/Build/iOS/GlucoseKit.framework/Info.plist and b/Carthage/Build/iOS/GlucoseKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib index 636928adb9..f7c994de2d 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib and b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/UITableViewController-jGX-GA-nlH.nib differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib index f07192a1dc..d83e48959f 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib and b/Carthage/Build/iOS/InsulinKit.framework/Base.lproj/InsulinKit.storyboardc/jGX-GA-nlH-view-ccM-3y-LQM.nib differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h b/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h index 93f6e27ba7..1ec9bf4309 100644 --- a/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h +++ b/Carthage/Build/iOS/InsulinKit.framework/Headers/InsulinKit-Swift.h @@ -92,16 +92,11 @@ typedef int swift_int4 __attribute__((__ext_vector_type__(4))); # endif #endif #if defined(__has_feature) && __has_feature(modules) -@import Foundation; @import UIKit; #endif #pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" #pragma clang diagnostic ignored "-Wduplicate-method-arg" - -@interface NSUserDefaults (SWIFT_EXTENSION(InsulinKit)) -@end - @class UITableView; @class NSIndexPath; @class UITableViewCell; diff --git a/Carthage/Build/iOS/InsulinKit.framework/Info.plist b/Carthage/Build/iOS/InsulinKit.framework/Info.plist index b39873cf78..a0e83a8d2d 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Info.plist and b/Carthage/Build/iOS/InsulinKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/InsulinKit b/Carthage/Build/iOS/InsulinKit.framework/InsulinKit index 17fab4c145..16063cf863 100755 Binary files a/Carthage/Build/iOS/InsulinKit.framework/InsulinKit and b/Carthage/Build/iOS/InsulinKit.framework/InsulinKit differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Model.momd/Model.mom b/Carthage/Build/iOS/InsulinKit.framework/Model.momd/Model.mom index 7a3a177461..f8bf41b435 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Model.momd/Model.mom and b/Carthage/Build/iOS/InsulinKit.framework/Model.momd/Model.mom differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Model.momd/VersionInfo.plist b/Carthage/Build/iOS/InsulinKit.framework/Model.momd/VersionInfo.plist index 11ed1b6ba8..41ccc99857 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Model.momd/VersionInfo.plist and b/Carthage/Build/iOS/InsulinKit.framework/Model.momd/VersionInfo.plist differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc index a592220474..34dac97812 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftdoc differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule index 55c2adafe4..a1edae6496 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm.swiftmodule differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc index f69ab23919..98ab995ec1 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftdoc differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule index 4a33b44822..83e37ee111 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/arm64.swiftmodule differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc index c678c67452..827f3ffd5b 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftdoc differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule index 91aad333c1..e0f3059fa4 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/i386.swiftmodule differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc index 876b3d1678..bf3d5d8c10 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftdoc differ diff --git a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule index 29af589312..dfe8dbafe6 100644 Binary files a/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/InsulinKit.framework/Modules/InsulinKit.swiftmodule/x86_64.swiftmodule differ diff --git a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib index adcf142719..4db72f28b7 100644 Binary files a/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/GlucoseRangeTableViewCell.nib differ diff --git a/Carthage/Build/iOS/LoopKit.framework/Info.plist b/Carthage/Build/iOS/LoopKit.framework/Info.plist index 9b2056caaa..d79a423ac4 100644 Binary files a/Carthage/Build/iOS/LoopKit.framework/Info.plist and b/Carthage/Build/iOS/LoopKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/LoopKit.framework/LoopKit b/Carthage/Build/iOS/LoopKit.framework/LoopKit index 50b4701b68..9d01d646dc 100755 Binary files a/Carthage/Build/iOS/LoopKit.framework/LoopKit and b/Carthage/Build/iOS/LoopKit.framework/LoopKit differ diff --git a/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib index 5236bae363..87853fe041 100644 Binary files a/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/RepeatingScheduleValueTableViewCell.nib differ diff --git a/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib b/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib index a20b86e918..c6d32627da 100644 Binary files a/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib and b/Carthage/Build/iOS/LoopKit.framework/TextFieldTableViewCell.nib differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/Info.plist b/Carthage/Build/iOS/MinimedKit.framework/Info.plist index 25faaf47ab..ac83f26c52 100644 Binary files a/Carthage/Build/iOS/MinimedKit.framework/Info.plist and b/Carthage/Build/iOS/MinimedKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/MinimedKit b/Carthage/Build/iOS/MinimedKit.framework/MinimedKit index 743ac889a2..2c5408c875 100755 Binary files a/Carthage/Build/iOS/MinimedKit.framework/MinimedKit and b/Carthage/Build/iOS/MinimedKit.framework/MinimedKit differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm.swiftmodule index b070ff16f0..ab9d7dc0f5 100644 Binary files a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm.swiftmodule differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm64.swiftmodule index 0da1eb114b..5d69e24c73 100644 Binary files a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/arm64.swiftmodule differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/i386.swiftmodule index 28c8d1e0fc..1410b3e341 100644 Binary files a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/i386.swiftmodule differ diff --git a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/x86_64.swiftmodule index fe7764c559..924e7dcfb1 100644 Binary files a/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/MinimedKit.framework/Modules/MinimedKit.swiftmodule/x86_64.swiftmodule differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Headers/NightscoutUploadKit-Swift.h b/Carthage/Build/iOS/NightscoutUploadKit.framework/Headers/NightscoutUploadKit-Swift.h index c41eaff208..c9187507ea 100644 --- a/Carthage/Build/iOS/NightscoutUploadKit.framework/Headers/NightscoutUploadKit-Swift.h +++ b/Carthage/Build/iOS/NightscoutUploadKit.framework/Headers/NightscoutUploadKit-Swift.h @@ -103,11 +103,18 @@ typedef int swift_int4 __attribute__((__ext_vector_type__(4))); @end +@interface NSUserDefaults (SWIFT_EXTENSION(NightscoutUploadKit)) +@end + +@class NSDate; + SWIFT_CLASS("_TtC19NightscoutUploadKit18NightscoutUploader") @interface NightscoutUploader : NSObject @property (nonatomic, copy) NSString * _Nullable siteURL; @property (nonatomic, copy) NSString * _Nullable APISecret; -- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; +@property (nonatomic, readonly, strong) NSDate * _Nonnull observingPumpEventsSince; +@property (nonatomic, copy) NSString * _Nullable pumpID; +- (nonnull instancetype)initWithSiteURL:(NSString * _Nullable)siteURL APISecret:(NSString * _Nullable)APISecret pumpID:(NSString * _Nullable)pumpID OBJC_DESIGNATED_INITIALIZER; @end #pragma clang diagnostic pop diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Info.plist b/Carthage/Build/iOS/NightscoutUploadKit.framework/Info.plist index e882f9e34b..de4054c821 100644 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/Info.plist and b/Carthage/Build/iOS/NightscoutUploadKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm.swiftmodule index a1bc6ee185..fff5e24889 100644 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm.swiftmodule differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm64.swiftmodule index 7753d2fbdf..f356f56e10 100644 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/arm64.swiftmodule differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/i386.swiftmodule index 55e8240b8e..d3784bd097 100644 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/i386.swiftmodule differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/x86_64.swiftmodule index 2fb0ad95a7..6dd005efec 100644 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/NightscoutUploadKit.framework/Modules/NightscoutUploadKit.swiftmodule/x86_64.swiftmodule differ diff --git a/Carthage/Build/iOS/NightscoutUploadKit.framework/NightscoutUploadKit b/Carthage/Build/iOS/NightscoutUploadKit.framework/NightscoutUploadKit index 59f066dcb8..989e4483ea 100755 Binary files a/Carthage/Build/iOS/NightscoutUploadKit.framework/NightscoutUploadKit and b/Carthage/Build/iOS/NightscoutUploadKit.framework/NightscoutUploadKit differ diff --git a/Carthage/Build/iOS/RileyLinkBLEKit.framework/Info.plist b/Carthage/Build/iOS/RileyLinkBLEKit.framework/Info.plist index 045aa7ef7e..008fd2cc2f 100644 Binary files a/Carthage/Build/iOS/RileyLinkBLEKit.framework/Info.plist and b/Carthage/Build/iOS/RileyLinkBLEKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/RileyLinkBLEKit.framework/RileyLinkBLEKit b/Carthage/Build/iOS/RileyLinkBLEKit.framework/RileyLinkBLEKit index 47ff231a1e..2fc5adfd9c 100755 Binary files a/Carthage/Build/iOS/RileyLinkBLEKit.framework/RileyLinkBLEKit and b/Carthage/Build/iOS/RileyLinkBLEKit.framework/RileyLinkBLEKit differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/Info.plist b/Carthage/Build/iOS/RileyLinkKit.framework/Info.plist index eacd4ad703..aacdba4e07 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/Info.plist and b/Carthage/Build/iOS/RileyLinkKit.framework/Info.plist differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm.swiftmodule b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm.swiftmodule index 63162f3a79..fbcc13b10f 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm.swiftmodule and b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm.swiftmodule differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm64.swiftmodule b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm64.swiftmodule index 17625ee75c..79c197018f 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm64.swiftmodule and b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/arm64.swiftmodule differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/i386.swiftmodule b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/i386.swiftmodule index 35af82acfd..aa0738032f 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/i386.swiftmodule and b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/i386.swiftmodule differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/x86_64.swiftmodule b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/x86_64.swiftmodule index 0a04fee9c0..925afe1d52 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/x86_64.swiftmodule and b/Carthage/Build/iOS/RileyLinkKit.framework/Modules/RileyLinkKit.swiftmodule/x86_64.swiftmodule differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkDeviceTableViewCell.nib b/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkDeviceTableViewCell.nib index 0930e9da15..7a7b47a695 100644 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkDeviceTableViewCell.nib and b/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkDeviceTableViewCell.nib differ diff --git a/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkKit b/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkKit index f70fa823ae..67f1646a1e 100755 Binary files a/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkKit and b/Carthage/Build/iOS/RileyLinkKit.framework/RileyLinkKit differ diff --git a/Carthage/Build/iOS/SwiftCharts.framework/SwiftCharts b/Carthage/Build/iOS/SwiftCharts.framework/SwiftCharts index e2c292f06b..944f529fef 100755 Binary files a/Carthage/Build/iOS/SwiftCharts.framework/SwiftCharts and b/Carthage/Build/iOS/SwiftCharts.framework/SwiftCharts differ diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj index 45963db5fa..ab5948a734 100644 --- a/Loop.xcodeproj/project.pbxproj +++ b/Loop.xcodeproj/project.pbxproj @@ -48,6 +48,8 @@ 435400351C9F878D00D5819C /* SetBolusUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */; }; 4354003A1C9FB81100D5819C /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92501C541832001FFDE1 /* UIColor.swift */; }; 43649A631C7A347F00523D7F /* CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43649A621C7A347F00523D7F /* CollectionType.swift */; }; + 436FACEC1D0BA246004E2427 /* SegmentedControlTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 436FACEB1D0BA246004E2427 /* SegmentedControlTableViewCell.swift */; }; + 436FACEE1D0BA636004E2427 /* InsulinDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 436FACED1D0BA636004E2427 /* InsulinDataSource.swift */; }; 43776F901B8022E90074EA36 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43776F8F1B8022E90074EA36 /* AppDelegate.swift */; }; 43776F971B8022E90074EA36 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43776F951B8022E90074EA36 /* Main.storyboard */; }; 43776F991B8022E90074EA36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43776F981B8022E90074EA36 /* Assets.xcassets */; }; @@ -124,6 +126,7 @@ 43F78D591C914C57002152D1 /* recommend_temp_basal_high_and_falling.json in Resources */ = {isa = PBXBuildFile; fileRef = 43F78D581C914C57002152D1 /* recommend_temp_basal_high_and_falling.json */; }; 43F78D5B1C914CAB002152D1 /* recommend_temp_basal_in_range_and_rising.json in Resources */ = {isa = PBXBuildFile; fileRef = 43F78D5A1C914CAB002152D1 /* recommend_temp_basal_in_range_and_rising.json */; }; 43F78D5D1C914CEA002152D1 /* recommend_temp_basal_high_and_rising.json in Resources */ = {isa = PBXBuildFile; fileRef = 43F78D5C1C914CEA002152D1 /* recommend_temp_basal_high_and_rising.json */; }; + C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -232,6 +235,8 @@ 435400301C9F744E00D5819C /* BolusSuggestionUserInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusSuggestionUserInfo.swift; sourceTree = ""; }; 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetBolusUserInfo.swift; sourceTree = ""; }; 43649A621C7A347F00523D7F /* CollectionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionType.swift; sourceTree = ""; }; + 436FACEB1D0BA246004E2427 /* SegmentedControlTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentedControlTableViewCell.swift; sourceTree = ""; }; + 436FACED1D0BA636004E2427 /* InsulinDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsulinDataSource.swift; sourceTree = ""; }; 43776F8C1B8022E90074EA36 /* Loop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Loop.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43776F8F1B8022E90074EA36 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 43776F961B8022E90074EA36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -313,6 +318,7 @@ 43F78D581C914C57002152D1 /* recommend_temp_basal_high_and_falling.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_high_and_falling.json; sourceTree = ""; }; 43F78D5A1C914CAB002152D1 /* recommend_temp_basal_in_range_and_rising.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_in_range_and_rising.json; sourceTree = ""; }; 43F78D5C1C914CEA002152D1 /* recommend_temp_basal_high_and_rising.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_high_and_rising.json; sourceTree = ""; }; + C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NightscoutUploadKit.framework; path = Carthage/Build/iOS/NightscoutUploadKit.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -327,6 +333,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */, 439897391CD2F82C00223065 /* AmplitudeFramework.framework in Frameworks */, 43F78D4C1C914197002152D1 /* CarbKit.framework in Frameworks */, 43EDDBF21C361C75007D89B5 /* CommonCrypto.framework in Frameworks */, @@ -397,6 +404,7 @@ 43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */, 4331E0791C85650D00FBE832 /* ChartAxisValueDoubleLog.swift */, 434F24CA1CFCB7AB0004498F /* GlucoseRxMessage.swift */, + 436FACED1D0BA636004E2427 /* InsulinDataSource.swift */, 43C418B41CE0575200405B6A /* ShareGlucose+GlucoseKit.swift */, 434F24C81CFCA8940004498F /* TransmitterGlucose.swift */, 4328E0311CFC068900E199AA /* WatchContext+LoopKit.swift */, @@ -544,6 +552,7 @@ 437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */, 438DADC71CDE8F8B007697A5 /* LoopStateView.swift */, 437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */, + 436FACEB1D0BA246004E2427 /* SegmentedControlTableViewCell.swift */, 43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */, 43A5676A1C96155700334FAC /* SwitchTableViewCell.swift */, ); @@ -598,6 +607,7 @@ 968DCD53F724DE56FFE51920 /* Frameworks */ = { isa = PBXGroup; children = ( + C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */, 43B371871CE597D10013C5A6 /* ShareClient.framework */, 439897381CD2F82C00223065 /* AmplitudeFramework.framework */, 43F78D481C914197002152D1 /* CarbKit.framework */, @@ -840,6 +850,8 @@ "$(SRCROOT)/Carthage/Build/iOS/RileyLinkKit.framework", "$(SRCROOT)/Carthage/Build/iOS/AmplitudeFramework.framework", "$(SRCROOT)/Carthage/Build/iOS/ShareClient.framework", + "$(SRCROOT)/Carthage/Build/iOS/NightscoutUploadKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/Crypto.framework", ); outputPaths = ( ); @@ -874,6 +886,7 @@ 43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */, 4346D1E71C77F5FE00ABAFE3 /* ChartTableViewCell.swift in Sources */, 437CEEE41CDE5C0A003C8C80 /* UIImage.swift in Sources */, + 436FACEC1D0BA246004E2427 /* SegmentedControlTableViewCell.swift in Sources */, 43DBF0591C93F73800B3C386 /* CarbEntryTableViewController.swift in Sources */, 43DE925C1C547A20001FFDE1 /* WatchContext.swift in Sources */, 43EB40861C82646A00472A8C /* StatusChartManager.swift in Sources */, @@ -896,6 +909,7 @@ 437CEECA1CD84DB7003C8C80 /* BatteryLevelHUDView.swift in Sources */, 43F78D261C8FC000002152D1 /* DoseMath.swift in Sources */, 4331E07A1C85650D00FBE832 /* ChartAxisValueDoubleLog.swift in Sources */, + 436FACEE1D0BA636004E2427 /* InsulinDataSource.swift in Sources */, 439897371CD2F80600223065 /* AnalyticsManager.swift in Sources */, 4346D1F61C78501000ABAFE3 /* ChartPoint.swift in Sources */, 43F4EF1D1BA2A57600526CE1 /* DiagnosticLogger.swift in Sources */, diff --git a/Loop/Base.lproj/Main.storyboard b/Loop/Base.lproj/Main.storyboard index e6226d6b36..aab080e5dc 100644 --- a/Loop/Base.lproj/Main.storyboard +++ b/Loop/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -10,13 +10,13 @@ - + - + @@ -65,11 +65,46 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,7 +173,7 @@ - + @@ -150,7 +185,7 @@ - + - + @@ -188,7 +223,7 @@ - + - + @@ -229,7 +264,7 @@ - + - + - + @@ -358,7 +393,7 @@ - + @@ -366,7 +401,7 @@ - + @@ -374,7 +409,7 @@ - + @@ -398,7 +433,7 @@ - + @@ -413,35 +448,36 @@ - - - - - - - - + + + - - - - + + + + + + + @@ -452,37 +488,38 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - + + + + + + + diff --git a/Loop/Extensions/NSUserDefaults.swift b/Loop/Extensions/NSUserDefaults.swift index c741c659d2..3bb2c02186 100644 --- a/Loop/Extensions/NSUserDefaults.swift +++ b/Loop/Extensions/NSUserDefaults.swift @@ -22,6 +22,7 @@ extension NSUserDefaults { case GlucoseTargetRangeSchedule = "com.loudnate.Naterade.GlucoseTargetRangeSchedule" case MaximumBasalRatePerHour = "com.loudnate.Naterade.MaximumBasalRatePerHour" case MaximumBolus = "com.loudnate.Naterade.MaximumBolus" + case PreferredInsulinDataSource = "com.loudnate.Loop.PreferredInsulinDataSource" case PumpID = "com.loudnate.Naterade.PumpID" case PumpModelNumber = "com.loudnate.Naterade.PumpModelNumber" case PumpTimeZone = "com.loudnate.Naterade.PumpTimeZone" @@ -144,6 +145,19 @@ extension NSUserDefaults { } } + var preferredInsulinDataSource: InsulinDataSource? { + get { + return InsulinDataSource(rawValue: integerForKey(Key.PreferredInsulinDataSource.rawValue)) + } + set { + if let preferredInsulinDataSource = preferredInsulinDataSource { + setInteger(preferredInsulinDataSource.rawValue, forKey: Key.PreferredInsulinDataSource.rawValue) + } else { + removeObjectForKey(Key.PreferredInsulinDataSource.rawValue) + } + } + } + var pumpID: String? { get { return stringForKey(Key.PumpID.rawValue) diff --git a/Loop/Info.plist b/Loop/Info.plist index f8986184d6..a1e7cea32c 100644 --- a/Loop/Info.plist +++ b/Loop/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.3.1 + 0.4.0 CFBundleSignature ???? CFBundleVersion diff --git a/Loop/Managers/DeviceDataManager.swift b/Loop/Managers/DeviceDataManager.swift index 18ad9d644b..8d15877803 100644 --- a/Loop/Managers/DeviceDataManager.swift +++ b/Loop/Managers/DeviceDataManager.swift @@ -16,6 +16,7 @@ import MinimedKit import RileyLinkKit import ShareClient import xDripG5 +import NightscoutUploadKit enum State { case NeedsConfiguration @@ -30,10 +31,6 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { /// Notification posted by the instance when new pump data was processed static let PumpStatusUpdatedNotification = "com.loudnate.Naterade.notification.PumpStatusUpdated" - enum Error: ErrorType { - case ValueError(String) - } - // MARK: - Utilities lazy var logger = DiagnosticLogger() @@ -44,6 +41,12 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { /// The share server client private let shareClient: ShareClient? + /// Nightscout Uploader + var nightscoutUploader: NightscoutUploader? + + // Timestamp of last event we've retrieved from pump + var observingPumpEventsSince = NSDate(timeIntervalSinceNow: NSTimeInterval(hours: -24)) + /// The G5 transmitter object var transmitter: Transmitter? { switch transmitterState { @@ -60,6 +63,13 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { NSNotificationCenter.defaultCenter().postNotificationName(note.name, object: self, userInfo: note.userInfo) } + /** + Called when a new idle message is received by the RileyLink. + + Only MySentryPumpStatus messages are handled. + + - parameter note: The notification object + */ @objc private func receivedRileyLinkPacketNotification(note: NSNotification) { if let device = note.object as? RileyLinkDevice, @@ -112,7 +122,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { /** Handles receiving a MySentry status message, which are only posted by MM x23 pumps. - + This message has two important pieces of info about the pump: reservoir volume and battery. Because the RileyLink must actively listen for these packets, they are not the most reliable heartbeat. However, we can still use them to assert glucose data is current. @@ -132,12 +142,17 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { backfillGlucoseFromShareIfNeeded() - updateReservoirVolume(status.reservoirRemainingUnits, atDate: pumpDate, withTimeLeft: NSTimeInterval(minutes: Double(status.reservoirRemainingMinutes))) + // Sentry packets are sent in groups of 3, 5s apart. Wait 11s before allowing the loop data to continue to avoid conflicting comms. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(11 * NSEC_PER_SEC)), dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) { + self.updateReservoirVolume(status.reservoirRemainingUnits, atDate: pumpDate, withTimeLeft: NSTimeInterval(minutes: Double(status.reservoirRemainingMinutes))) + } // Check for an empty battery. Sentry packets are still broadcast for a few hours after this value reaches 0. if status.batteryRemainingPercent == 0 { NotificationManager.sendPumpBatteryLowNotification() } + + nightscoutUploader?.handlePumpStatus(status, device: device.deviceURI) } /** @@ -156,7 +171,11 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { self.latestReservoirValue = newValue - NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.PumpStatusUpdatedNotification, object: self) + if self.preferredInsulinDataSource == .PumpHistory { + self.fetchPumpHistory() + } else { + NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.PumpStatusUpdatedNotification, object: self) + } // Send notifications for low reservoir if necessary if let newVolume = newValue?.unitVolume, previousVolume = previousValue?.unitVolume { @@ -195,23 +214,83 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { switch result { case .Success(let units): self.updateReservoirVolume(units, atDate: NSDate(), withTimeLeft: nil) - case .Failure: - // Try to troubleshoot communications errors with the pump - - // How long should we wait before we re-tune the RileyLink? - let tuneTolerance = NSTimeInterval(minutes: 14) - - if device.lastTuned?.timeIntervalSinceNow <= -tuneTolerance { - device.tunePumpWithResultHandler { (result) in - switch result { - case .Success(let scanResult): - self.logger?.addError("Device auto-tuned to \(scanResult.bestFrequency) MHz", fromSource: "RileyLink") - case .Failure(let error): - self.logger?.addError("Device auto-tune failed with error: \(error)", fromSource: "RileyLink") - } - } + case .Failure(let error): + self.logger?.addError("Failed to fetch reservoir: \(error)", fromSource: "RileyLink") + self.troubleshootPumpCommsWithDevice(device) + } + } + } + } + + private func fetchPumpHistory() { + guard let device = rileyLinkManager.firstConnectedDevice else { + return + } + + /* + This is where we fetch history. + */ + + // TODO: Reconcile these + //let startDate = doseStore.pumpEventQueryAfterDate + let startDate = nightscoutUploader?.observingPumpEventsSince ?? observingPumpEventsSince + + device.ops?.getHistoryEventsSinceDate(startDate) { (result) in + switch result { + case let .Success(events, pumpModel): + // TODO: Surface raw pump event data and add DoseEntry conformance + // self.doseStore.addPumpEvents(events.map({ ($0.date, nil, nil, $0.isMutable()) })) { (error) in + // if let error = error { + // self.logger?.addError("Failed to store history: \(error)", fromSource: "DoseStore") + // } + // } + + NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.PumpStatusUpdatedNotification, object: self) + self.nightscoutUploader?.processPumpEvents(events, source: device.deviceURI, pumpModel: pumpModel) + + + var lastFinalDate: NSDate? + var firstMutableDate: NSDate? + + for event in events { + if event.isMutable() { + firstMutableDate = min(event.date, firstMutableDate ?? event.date) + } else { + lastFinalDate = max(event.date, lastFinalDate ?? event.date) } } + if let mutableDate = firstMutableDate { + self.observingPumpEventsSince = mutableDate + } else if let finalDate = lastFinalDate { + self.observingPumpEventsSince = finalDate + } + + + case .Failure(let error): + self.logger?.addError("Failed to fetch history: \(error)", fromSource: "RileyLink") + self.troubleshootPumpCommsWithDevice(device) + } + } + } + + /** + Attempts to fix an extended communication failure between a RileyLink device and the pump + + - parameter device: The RileyLink device + */ + private func troubleshootPumpCommsWithDevice(device: RileyLinkDevice) { + + // How long we should wait before we re-tune the RileyLink + let tuneTolerance = NSTimeInterval(minutes: 14) + + if device.lastTuned?.timeIntervalSinceNow <= -tuneTolerance { + device.tunePumpWithResultHandler { (result) in + switch result { + case .Success(let scanResult): + self.logger?.addError("Device auto-tuned to \(scanResult.bestFrequency) MHz", fromSource: "RileyLink") + case .Failure(let error): + self.logger?.addError("Device auto-tune failed with error: \(error)", fromSource: "RileyLink") + } } } } @@ -317,17 +396,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { // MARK: - Configuration - private var transmitterState: State = .NeedsConfiguration { - didSet { - switch transmitterState { - case .Ready(let transmitter): - transmitter.delegate = self - rileyLinkManager.timerTickEnabled = false - case .NeedsConfiguration: - rileyLinkManager.timerTickEnabled = true - } - } - } + // MARK: Pump private var connectedPeripheralIDs: Set = Set(NSUserDefaults.standardUserDefaults().connectedPeripheralIDs) { didSet { @@ -356,6 +425,7 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { self.pumpState = nil } + nightscoutUploader?.pumpID = pumpID doseStore.pumpID = pumpID NSUserDefaults.standardUserDefaults().pumpID = pumpID @@ -411,6 +481,27 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } + /// The user's preferred method of fetching insulin data from the pump + var preferredInsulinDataSource = NSUserDefaults.standardUserDefaults().preferredInsulinDataSource ?? .PumpHistory { + didSet { + NSUserDefaults.standardUserDefaults().preferredInsulinDataSource = preferredInsulinDataSource + } + } + + // MARK: G5 Transmitter + + private var transmitterState: State = .NeedsConfiguration { + didSet { + switch transmitterState { + case .Ready(let transmitter): + transmitter.delegate = self + rileyLinkManager.timerTickEnabled = false + case .NeedsConfiguration: + rileyLinkManager.timerTickEnabled = true + } + } + } + var transmitterID: String? { didSet { if transmitterID?.characters.count != 6 { @@ -437,6 +528,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { } } + // MARK: Loop model inputs + var basalRateSchedule: BasalRateSchedule? = NSUserDefaults.standardUserDefaults().basalRateSchedule { didSet { doseStore.basalProfile = basalRateSchedule @@ -577,8 +670,8 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { rileyLinkManager.idleListeningEnabled = idleListeningEnabled if let settings = NSBundle.mainBundle().remoteSettings, - username = settings["ShareAccountName"], - password = settings["ShareAccountPassword"] + username = settings["ShareAccountName"], + password = settings["ShareAccountPassword"] where !username.isEmpty && !password.isEmpty { shareClient = ShareClient(username: username, password: password) @@ -586,6 +679,19 @@ class DeviceDataManager: CarbStoreDelegate, TransmitterDelegate { shareClient = nil } + if let settings = NSBundle.mainBundle().remoteSettings, + siteURL = settings["NightscoutSiteURL"], + APISecret = settings["NightscoutAPISecret"] + { + nightscoutUploader = NightscoutUploader(siteURL: siteURL, APISecret: APISecret, pumpID: pumpID) + nightscoutUploader!.errorHandler = { (error: ErrorType, context: String) -> Void in + print("Error \(error), while \(context)") + } + + } else { + nightscoutUploader = nil + } + NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkManagerNotification(_:)), name: nil, object: rileyLinkManager) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkPacketNotification(_:)), name: RileyLinkDevice.DidReceiveIdleMessageNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(receivedRileyLinkTimerTickNotification(_:)), name: RileyLinkDevice.DidUpdateTimerTickNotification, object: nil) diff --git a/Loop/Managers/LoopDataManager.swift b/Loop/Managers/LoopDataManager.swift index 40bb82d183..7a1d3e0dff 100644 --- a/Loop/Managers/LoopDataManager.swift +++ b/Loop/Managers/LoopDataManager.swift @@ -59,15 +59,7 @@ class LoopDataManager { } }, center.addObserverForName(DeviceDataManager.PumpStatusUpdatedNotification, object: deviceDataManager, queue: nil) { (note) -> Void in - self.waitingForSentryPackets = true - - NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.LoopRunningNotification, object: self) - - // Sentry packets are sent in groups of 3, 5s apart. Wait 11s to avoid conflicting comms. - let waitTime = self.deviceDataManager.latestPumpStatus != nil ? Int64(11 * NSEC_PER_SEC) : 0 - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, waitTime), self.dataAccessQueue) { - self.waitingForSentryPackets = false + dispatch_async(self.dataAccessQueue) { self.insulinEffect = nil self.loop() } @@ -83,6 +75,8 @@ class LoopDataManager { } private func loop() { + NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.LoopRunningNotification, object: self) + lastLoopError = nil do { @@ -175,9 +169,7 @@ class LoopDataManager { } private func notify() { - if !waitingForSentryPackets { - NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.LoopDataUpdatedNotification, object: self) - } + NSNotificationCenter.defaultCenter().postNotificationName(self.dynamicType.LoopDataUpdatedNotification, object: self) } /** @@ -251,7 +243,6 @@ class LoopDataManager { AnalyticsManager.loopDidSucceed() } } - private var waitingForSentryPackets = false private func updateCarbEffect(completionHandler: (effects: [GlucoseEffect]?, error: ErrorType?) -> Void) { let glucose = deviceDataManager.glucoseStore?.latestGlucose diff --git a/Loop/Managers/WatchDataManager.swift b/Loop/Managers/WatchDataManager.swift index 840a1e161e..ffae6e2c40 100644 --- a/Loop/Managers/WatchDataManager.swift +++ b/Loop/Managers/WatchDataManager.swift @@ -117,7 +117,7 @@ class WatchDataManager: NSObject, WCSessionDelegate { } } - private func addCarbEntryFromWatchMessage(message: [String: AnyObject], completionHandler: ((units: Double?, error: ErrorType?) -> Void)? = nil) { + private func addCarbEntryFromWatchMessage(message: [String: AnyObject], completionHandler: ((units: Double?) -> Void)? = nil) { if let carbStore = deviceDataManager.carbStore, carbEntry = CarbEntryUserInfo(rawValue: message) { let newEntry = NewCarbEntry( quantity: HKQuantity(unit: carbStore.preferredUnit, doubleValue: carbEntry.value), @@ -133,10 +133,10 @@ class WatchDataManager: NSObject, WCSessionDelegate { AnalyticsManager.didAddCarbsFromWatch(carbEntry.value) } - completionHandler?(units: units, error: error) + completionHandler?(units: units) } } else { - completionHandler?(units: nil, error: DeviceDataManager.Error.ValueError("Unable to parse CarbEntryUserInfo: \(message)")) + completionHandler?(units: nil) } } @@ -145,7 +145,7 @@ class WatchDataManager: NSObject, WCSessionDelegate { func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String: AnyObject]) -> Void) { switch message["name"] as? String { case CarbEntryUserInfo.name?: - addCarbEntryFromWatchMessage(message) { (units, error) in + addCarbEntryFromWatchMessage(message) { (units) in replyHandler(BolusSuggestionUserInfo(recommendedBolus: units ?? 0).rawValue) } case SetBolusUserInfo.name?: diff --git a/Loop/Models/InsulinDataSource.swift b/Loop/Models/InsulinDataSource.swift new file mode 100644 index 0000000000..f15d649036 --- /dev/null +++ b/Loop/Models/InsulinDataSource.swift @@ -0,0 +1,13 @@ +// +// InsulinDataSource.swift +// Loop +// +// Created by Nathan Racklyeft on 6/10/16. +// Copyright © 2016 Nathan Racklyeft. All rights reserved. +// + + +enum InsulinDataSource: Int { + case PumpHistory + case Reservoir +} diff --git a/Loop/View Controllers/SettingsTableViewController.swift b/Loop/View Controllers/SettingsTableViewController.swift index 967b4e93ac..020fa92dad 100644 --- a/Loop/View Controllers/SettingsTableViewController.swift +++ b/Loop/View Controllers/SettingsTableViewController.swift @@ -91,8 +91,9 @@ class SettingsTableViewController: UITableViewController, DailyValueScheduleTabl private enum LoopRow: Int { case Dosing = 0 + case PreferredInsulinDataSource - static let count = 1 + static let count = 2 } private enum ConfigurationRow: Int { @@ -151,6 +152,14 @@ class SettingsTableViewController: UITableViewController, DailyValueScheduleTabl switchCell.`switch`?.addTarget(self, action: #selector(dosingEnabledChanged(_:)), forControlEvents: .ValueChanged) return switchCell + case .PreferredInsulinDataSource: + let segmentCell = tableView.dequeueReusableCellWithIdentifier(SegmentedControlTableViewCell.className, forIndexPath: indexPath) as! SegmentedControlTableViewCell + + segmentCell.titleLabel.text = NSLocalizedString("Nightscout history uploading", comment: "The title text for the preferred insulin data source config") + segmentCell.segmentedControl.selectedSegmentIndex = dataManager.preferredInsulinDataSource.rawValue + segmentCell.segmentedControl.addTarget(self, action: #selector(preferredInsulinDataSourceChanged(_:)), forControlEvents: .ValueChanged) + + return segmentCell } case .Configuration: let configCell = tableView.dequeueReusableCellWithIdentifier(ConfigCellIdentifier, forIndexPath: indexPath) @@ -436,6 +445,12 @@ class SettingsTableViewController: UITableViewController, DailyValueScheduleTabl } } + func preferredInsulinDataSourceChanged(sender: UISegmentedControl) { + if let dataSource = InsulinDataSource(rawValue: sender.selectedSegmentIndex) { + dataManager.preferredInsulinDataSource = dataSource + } + } + // MARK: - TextFieldTableViewControllerDelegate func textFieldTableViewControllerDidEndEditing(controller: TextFieldTableViewController) { diff --git a/Loop/Views/SegmentedControlTableViewCell.swift b/Loop/Views/SegmentedControlTableViewCell.swift new file mode 100644 index 0000000000..f679619041 --- /dev/null +++ b/Loop/Views/SegmentedControlTableViewCell.swift @@ -0,0 +1,29 @@ +// +// SegmentedControlTableViewCell.swift +// Loop +// +// Created by Nathan Racklyeft on 6/10/16. +// Copyright © 2016 Nathan Racklyeft. All rights reserved. +// + +import UIKit + +class SegmentedControlTableViewCell: UITableViewCell { + + @IBOutlet weak var titleLabel: UILabel! + + @IBOutlet weak var segmentedControl: UISegmentedControl! + + override func awakeFromNib() { + super.awakeFromNib() + + segmentedControl.selectedSegmentIndex = 0 + } + + override func prepareForReuse() { + super.prepareForReuse() + + segmentedControl.removeTarget(nil, action: nil, forControlEvents: .ValueChanged) + } + +} diff --git a/Loop/Views/StatusChartHighlightLayer.swift b/Loop/Views/StatusChartHighlightLayer.swift index 82bedd4a4f..914dc6ad69 100644 --- a/Loop/Views/StatusChartHighlightLayer.swift +++ b/Loop/Views/StatusChartHighlightLayer.swift @@ -29,7 +29,7 @@ class StatusChartHighlightLayer: ChartPointsTouchHighl } }, viewGenerator: { (chartPointModel, layer, chart) -> U? in - let containerView = U(frame: chart.frame) + let containerView = U(frame: chart.bounds) let xAxisOverlayView = UIView(frame: xAxis.rect.offsetBy(dx: 0, dy: 1)) xAxisOverlayView.backgroundColor = UIColor.whiteColor() diff --git a/LoopTests/Info.plist b/LoopTests/Info.plist index 27ce33f16b..e82cdb5f9e 100644 --- a/LoopTests/Info.plist +++ b/LoopTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.3.1 + 0.4.0 CFBundleSignature ???? CFBundleVersion diff --git a/README.md b/README.md index 6a0bc9f455..4309654816 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ In the Loop project's Build Settings, change the value of `MAIN_APP_BUNDLE_IDENT Loop optionally supports select third-party remote services. While none of them are required to run the app, including [mLab](https://mlab.com) keys is strongly recommended at this time so loop diagnostic data can be stored in case retrospective analysis is needed. +If the Nightscout related entries are included, treatments and other pump data will be uploaded to your Nightscout site. Note you will need to set "Nightscout history uploading" to "On" in Settings for treatments to be fetched from your pump and uploaded to Nightscout. + After a fresh clone of the repository, you'll need duplicate the template file and populate the copy with values. ```bash @@ -93,10 +95,16 @@ $ cp Loop/RemoteSettings-template.plist Loop/RemoteSettings.plist | `AmplitudeAPIKey` | Your Amplitude analytics API Key (for optional, private behavior tracking) | `ShareAccountName` | Your username for Dexcom share (for backfilling glucose data) | `ShareAccountPassword` | Your password for Dexcom share +| `NightscoutSiteURL` | Your Nightscout site URL +| `NightscoutAPISecret` | Your Nightscout API Secret (not hashed) + +## Installing Carthage + +[Carthage](https://github.com/carthage/carthage) is used to manage framework dependencies. It will need to be [installed on your Mac](https://github.com/carthage/carthage#installing-carthage) to build and run the app, but most users won't have a need to explicitly rebuild any dependencies. # Making it Your Own -[Please visit the Wiki for more info on customizing the app](https://github.com/loudnate/Loop/wiki/) +[Please visit the Wiki for more info on customizing the app](https://github.com/loudnate/Loop/wiki/Personalizing-Your-App-Name-&-Icon) # License and Code of Conduct diff --git a/WatchApp Extension/Info.plist b/WatchApp Extension/Info.plist index 8f2bd8dd2b..65d1385130 100644 --- a/WatchApp Extension/Info.plist +++ b/WatchApp Extension/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.3.1 + 0.4.0 CFBundleSignature ???? CFBundleVersion diff --git a/WatchApp/Info.plist b/WatchApp/Info.plist index 6a5c9c6733..8438205d72 100644 --- a/WatchApp/Info.plist +++ b/WatchApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.3.1 + 0.4.0 CFBundleSignature ???? CFBundleVersion