Przeglądaj źródła

Merge pull request #113 from jonfawcett/dev

Update to new Dev features
jonfawcett 5 lat temu
rodzic
commit
4c2780b40f

+ 6 - 4
LoopFollow.xcodeproj/project.pbxproj

@@ -14,7 +14,7 @@
 		DDCF979624C1443C002C9752 /* GeneralSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */; };
 		DDCF979824C1489C002C9752 /* GraphSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */; };
 		DDCF979A24C14DB4002C9752 /* WatchSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */; };
-		DDCF979C24C14EFB002C9752 /* DebugSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */; };
+		DDCF979C24C14EFB002C9752 /* AdvancedSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979B24C14EFB002C9752 /* AdvancedSettingsViewController.swift */; };
 		DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979D24C2382A002C9752 /* AppStateController.swift */; };
 		FC16A97A24996673003D6245 /* NightScout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97924996673003D6245 /* NightScout.swift */; };
 		FC16A97B249966A3003D6245 /* AlarmSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */; };
@@ -180,7 +180,7 @@
 		DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSettingsViewController.swift; sourceTree = "<group>"; };
-		DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugSettingsViewController.swift; sourceTree = "<group>"; };
+		DDCF979B24C14EFB002C9752 /* AdvancedSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979D24C2382A002C9752 /* AppStateController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateController.swift; sourceTree = "<group>"; };
 		ECA3EFB4037410B4973BB632 /* Pods-LoopFollow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LoopFollow.debug.xcconfig"; path = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig"; sourceTree = "<group>"; };
 		FC16A97924996673003D6245 /* NightScout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightScout.swift; sourceTree = "<group>"; };
@@ -620,7 +620,7 @@
 				DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */,
 				DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */,
 				DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */,
-				DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */,
+				DDCF979B24C14EFB002C9752 /* AdvancedSettingsViewController.swift */,
 			);
 			path = ViewControllers;
 			sourceTree = "<group>";
@@ -878,7 +878,7 @@
 				FC16A97F249969E2003D6245 /* Graphs.swift in Sources */,
 				FC8589BF252B54F500C8FC73 /* Mobileprovision.swift in Sources */,
 				DD152D3B24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift in Sources */,
-				DDCF979C24C14EFB002C9752 /* DebugSettingsViewController.swift in Sources */,
+				DDCF979C24C14EFB002C9752 /* AdvancedSettingsViewController.swift in Sources */,
 				FC97881C2485969B00A7906C /* MainViewController.swift in Sources */,
 				FC1BB3A8252CA4C5003839C2 /* UIImageExtension.swift in Sources */,
 				DDCF979624C1443C002C9752 /* GeneralSettingsViewController.swift in Sources */,
@@ -1054,6 +1054,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.$(unique_id).LoopFollow";
 				PRODUCT_NAME = "Loop Follow";
+				SUPPORTS_MACCATALYST = YES;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 			};
@@ -1075,6 +1076,7 @@
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.$(unique_id).LoopFollow";
 				PRODUCT_NAME = "Loop Follow";
+				SUPPORTS_MACCATALYST = YES;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 			};

+ 24 - 5
LoopFollow/Application/Base.lproj/Main.storyboard

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="49e-Tb-3d3">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="49e-Tb-3d3">
     <device id="retina6_5" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17505"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="Stack View standard spacing" minToolsVersion="9.0"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
@@ -369,7 +369,7 @@
                                         <rect key="frame" x="0.0" y="359" width="398" height="352"/>
                                         <subviews>
                                             <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="HFL-Ye-6HR">
-                                                <rect key="frame" x="103.66666666666667" y="152" width="190.66666666666663" height="48"/>
+                                                <rect key="frame" x="103.66666666666667" y="142" width="190.66666666666663" height="68"/>
                                                 <subviews>
                                                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Clock" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r85-eB-vVd">
                                                         <rect key="frame" x="0.0" y="0.0" width="190.66666666666666" height="48"/>
@@ -381,7 +381,7 @@
                                                         </variation>
                                                     </label>
                                                     <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Alert Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tiA-fs-ZRV">
-                                                        <rect key="frame" x="0.0" y="0.0" width="190.66666666666666" height="0.0"/>
+                                                        <rect key="frame" x="0.0" y="58" width="190.66666666666666" height="0.0"/>
                                                         <fontDescription key="fontDescription" type="system" pointSize="70"/>
                                                         <nil key="textColor"/>
                                                         <nil key="highlightedColor"/>
@@ -390,7 +390,7 @@
                                                         </variation>
                                                     </label>
                                                     <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Meu-VT-byv">
-                                                        <rect key="frame" x="0.0" y="0.0" width="190.66666666666666" height="0.0"/>
+                                                        <rect key="frame" x="0.0" y="58" width="190.66666666666666" height="0.0"/>
                                                         <color key="backgroundColor" systemColor="labelColor"/>
                                                         <fontDescription key="fontDescription" type="system" pointSize="70"/>
                                                         <state key="normal" title="Snooze">
@@ -403,6 +403,23 @@
                                                             <action selector="SnoozeButton:" destination="e0E-cx-0Wr" eventType="touchUpInside" id="vNY-W3-rAn"/>
                                                         </connections>
                                                     </button>
+                                                    <stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dav-Y8-lSK">
+                                                        <rect key="frame" x="0.0" y="68" width="190.66666666666666" height="0.0"/>
+                                                        <subviews>
+                                                            <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="snoozeMinutes" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iC4-A1-q9b">
+                                                                <rect key="frame" x="0.0" y="0.0" width="0.0" height="32"/>
+                                                                <fontDescription key="fontDescription" type="system" pointSize="20"/>
+                                                                <nil key="textColor"/>
+                                                                <nil key="highlightedColor"/>
+                                                            </label>
+                                                            <stepper hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="1000" translatesAutoresizingMaskIntoConstraints="NO" id="0cS-P2-Zus">
+                                                                <rect key="frame" x="0.0" y="0.0" width="0.0" height="32"/>
+                                                                <connections>
+                                                                    <action selector="snoozeForMinuteValChanged:" destination="e0E-cx-0Wr" eventType="valueChanged" id="6x5-Fb-oad"/>
+                                                                </connections>
+                                                            </stepper>
+                                                        </subviews>
+                                                    </stackView>
                                                 </subviews>
                                             </stackView>
                                         </subviews>
@@ -434,6 +451,8 @@
                         <outlet property="MinAgoLabel" destination="HNC-P8-PbV" id="gLP-TD-hOq"/>
                         <outlet property="SnoozeButton" destination="Meu-VT-byv" id="Xnm-tj-t53"/>
                         <outlet property="clockLabel" destination="r85-eB-vVd" id="JTa-Uu-hdN"/>
+                        <outlet property="snoozeForMinuteLabel" destination="iC4-A1-q9b" id="Jvg-g0-bjs"/>
+                        <outlet property="snoozeForMinuteStepper" destination="0cS-P2-Zus" id="ren-xl-jxN"/>
                     </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="5xM-cL-5VG" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>

+ 47 - 20
LoopFollow/Controllers/Alarms.swift

@@ -21,11 +21,30 @@ extension MainViewController {
         let now = date.timeIntervalSince1970
         let currentBG = bgs[bgs.count - 1].sgv
         let lastBG = bgs[bgs.count - 2].sgv
-        guard let deltas: [Int] = [
-            bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv,
-            bgs[bgs.count - 2].sgv - bgs[bgs.count - 3].sgv,
-            bgs[bgs.count - 3].sgv - bgs[bgs.count - 4].sgv
-            ] else {}
+        
+        var deltas: [Int] = []
+        if bgs.count > 3 {
+            deltas.append(bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv)
+            deltas.append(bgs[bgs.count - 2].sgv - bgs[bgs.count - 3].sgv)
+            deltas.append(bgs[bgs.count - 3].sgv - bgs[bgs.count - 4].sgv)
+        } else if bgs.count > 2 {
+            deltas.append(bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv)
+            deltas.append(bgs[bgs.count - 2].sgv - bgs[bgs.count - 3].sgv)
+            // Set remainder to match the last delta we have
+            deltas.append(bgs[bgs.count - 2].sgv - bgs[bgs.count - 3].sgv)
+        } else if bgs.count > 1 {
+            deltas.append(bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv)
+            // Set remainder to match the last delta we have
+            deltas.append(bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv)
+            deltas.append(bgs[bgs.count - 1].sgv - bgs[bgs.count - 2].sgv)
+        } else {
+            // We only have 1 reading, set all to 0.
+            deltas.append(0)
+            deltas.append(0)
+            deltas.append(0)
+        }
+        
+        
         let currentBGTime = bgs[bgs.count - 1].date
         var alarmTriggered = false
         var numLoops = 0
@@ -72,7 +91,7 @@ extension MainViewController {
                 if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
                     AlarmSound.whichAlarm = "Urgent Low Alert"
                     if UserDefaultsRepository.alertUrgentLowRepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentLowSnooze.value)
                     return
                 } else {
                     return
@@ -84,7 +103,7 @@ extension MainViewController {
                 Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value {
                 AlarmSound.whichAlarm = "Low Alert"
                 if UserDefaultsRepository.alertLowRepeat.value { numLoops = -1 }
-                triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertLowSnooze.value)
                 return
             }
             
@@ -95,7 +114,7 @@ extension MainViewController {
                 if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
                     AlarmSound.whichAlarm = "Urgent High Alert"
                     if UserDefaultsRepository.alertUrgentHighRepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentHighSnooze.value)
                     return
                 } else {
                     return
@@ -113,7 +132,7 @@ extension MainViewController {
                 !UserDefaultsRepository.alertHighIsSnoozed.value {
                 AlarmSound.whichAlarm = "High Alert"
                 if UserDefaultsRepository.alertHighRepeat.value { numLoops = -1 }
-                triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertHighSnooze.value)
                 return
             }
             
@@ -131,7 +150,7 @@ extension MainViewController {
                         || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) {
                         AlarmSound.whichAlarm = "Fast Drop Alert"
                         if UserDefaultsRepository.alertFastDropRepeat.value { numLoops = -1 }
-                        triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                        triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastDropSnooze.value)
                         return
                     }
                 }
@@ -149,7 +168,7 @@ extension MainViewController {
                         || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) {
                         AlarmSound.whichAlarm = "Fast Rise Alert"
                         if UserDefaultsRepository.alertFastRiseRepeat.value { numLoops = -1 }
-                        triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                        triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastRiseSnooze.value)
                         return
                     }
                 }
@@ -165,7 +184,7 @@ extension MainViewController {
         if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) {
             AlarmSound.whichAlarm = "Missed Reading Alert"
             if UserDefaultsRepository.alertMissedReadingRepeat.value { numLoops = -1 }
-            triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+            triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedReadingSnooze.value)
             return
         }
         
@@ -188,7 +207,7 @@ extension MainViewController {
                     !UserDefaultsRepository.alertNotLoopingUseLimits.value) {
                     AlarmSound.whichAlarm = "Not Looping Alert"
                     if UserDefaultsRepository.alertNotLoopingRepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertNotLoopingSnooze.value)
                     return
                 }
             }
@@ -214,7 +233,7 @@ extension MainViewController {
                     if bolusData.count < 1 {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
                         if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
-                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
                         return
                     }
                     
@@ -238,7 +257,7 @@ extension MainViewController {
                     if (lastBolus == 0.0) {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
                         if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
-                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
                         return
                     }
                     
@@ -255,7 +274,7 @@ extension MainViewController {
                 if Double(tenDays) - Double(delta) <= alertDistance {
                     AlarmSound.whichAlarm = "Sensor Change Alert"
                     if UserDefaultsRepository.alertSAGERepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertSAGESnooze.value, snoozeIncrement: 1)
                     return
                 }
             }
@@ -269,7 +288,7 @@ extension MainViewController {
                 if Double(tenDays) - Double(delta) <= alertDistance {
                     AlarmSound.whichAlarm = "Pump Change Alert"
                     if UserDefaultsRepository.alertCAGERepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertCAGESnooze.value, snoozeIncrement: 1)
                     return
                 }
             }
@@ -280,7 +299,7 @@ extension MainViewController {
                 if latestPumpVolume <= alertAt {
                     AlarmSound.whichAlarm = "Low Insulin Alert"
                     if UserDefaultsRepository.alertPumpRepeat.value { numLoops = -1 }
-                    triggerAlarm(sound: UserDefaultsRepository.alertPumpSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+                    triggerAlarm(sound: UserDefaultsRepository.alertPumpSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertPumpSnoozeHours.value, snoozeIncrement: 1)
                     return
                 }
             }
@@ -342,13 +361,21 @@ extension MainViewController {
         startAlarmPlayingTimer()
     }
     
-    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?, overrideVolume: Bool, numLoops: Int)
+    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?, overrideVolume: Bool, numLoops: Int, snoozeTime: Int = 0, snoozeIncrement: Int = 5)
     {
         guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
         snoozer.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
         snoozer.SnoozeButton.isHidden = false
         snoozer.AlertLabel.isHidden = false
         snoozer.clockLabel.isHidden = true
+        snoozer.snoozeForMinuteLabel.text = String(snoozeTime)
+        snoozer.snoozeForMinuteStepper.value = Double(snoozeTime)
+        snoozer.snoozeForMinuteStepper.stepValue = Double(snoozeIncrement)
+        if snoozeTime != 0 {
+            snoozer.snoozeForMinuteStepper.isHidden = false
+            snoozer.snoozeForMinuteLabel.isHidden = false
+        }
+        
         tabBarController?.selectedIndex = 2
         if snooozedBGReadingTime != nil {
             UserDefaultsRepository.snoozedBGReadingTime.value = snooozedBGReadingTime
@@ -480,7 +507,7 @@ extension MainViewController {
 
         }
         
-        if UserDefaultsRepository.alertPumpIsSnoozed.value {
+        if date > UserDefaultsRepository.alertPumpSnoozedTime.value ?? date {
             UserDefaultsRepository.alertPumpSnoozedTime.setNil(key: "alertPumpSnoozedTime")
             UserDefaultsRepository.alertPumpIsSnoozed.value = false
             alarms.reloadSnoozeTime(key: "alertPumpSnoozedTime", setNil: true)

+ 1 - 0
LoopFollow/Controllers/AppStateController.swift

@@ -44,6 +44,7 @@ enum GeneralSettingsChangeEnum: Int {
    case screenlockSwitchStateChange = 512
     case showStatsChange = 1024
     case showSmallGraphChange = 2048
+    case useIFCCChange = 4096
 }
 
 class AppStateController {

+ 1 - 1
LoopFollow/Controllers/Graphs.swift

@@ -414,6 +414,7 @@ extension MainViewController {
     func updateBGGraph() {
         let dataIndex = 0
         let entries = bgData
+        if entries.count < 1 { return }
         var mainChart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
         var smallChart = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
         mainChart.clear()
@@ -449,7 +450,6 @@ extension MainViewController {
         lineBGSmall.circleColors.removeAll()
 
         if colors.count > 0 {
-            if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Graph: colors") }
             for i in 0..<colors.count{
                 mainChart.addColor(colors[i])
                 mainChart.circleColors.append(colors[i])

+ 1 - 1
LoopFollow/Controllers/NightScout.swift

@@ -224,7 +224,7 @@ extension MainViewController {
             
             // We have a current reading. Set timer to 5:10 from last reading
             } else {
-                self.startBGTimer(time: 310 - secondsAgo)
+                self.startBGTimer(time: 300 - secondsAgo + Double(UserDefaultsRepository.bgUpdateDelay.value))
                 let timerVal = 310 - secondsAgo
                 print("##### started 5:10 bg timer: \(timerVal)")
             }

+ 6 - 6
LoopFollow/Controllers/Stats.swift

@@ -64,16 +64,16 @@ class StatsData {
         for i in 0..<bgData.count {
             partialSum += (Float(bgData[i].sgv) - avgBG) * ( Float(bgData[i].sgv) - avgBG)
         }
+        
         stdDev = sqrt(partialSum / Float(bgData.count))
+        if UserDefaultsRepository.units.value != "mg/dL" {
+            stdDev = Float( bgUnits.toDisplayUnits( String( stdDev ) ) ) ?? 0.0;
+        }
         
-        if UserDefaultsRepository.units.value == "mg/dL" {
-            a1C = (46.7 + Float(avgBG)) / 28.7
+        if UserDefaultsRepository.useIFCC.value {
+            a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
         } else {
             a1C = (46.7 + Float(avgBG)) / 28.7
-            // Keep this for later.
-            // https://github.com/nightscout/nightguard/pull/72
-            // a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
-            stdDev = Float( bgUnits.toDisplayUnits( String( stdDev ) ) ) ?? 0.0;
         }
          
     }

+ 7 - 1
LoopFollow/Controllers/StatsView.swift

@@ -22,7 +22,13 @@ extension MainViewController {
             statsInRangePercent.text = String(format:"%.1f%", stats.percentRange) + "%"
             statsHighPercent.text = String(format:"%.1f%", stats.percentHigh) + "%"
             statsAvgBG.text = bgUnits.toDisplayUnits(String(format:"%.0f%", stats.avgBG))
-            statsEstA1C.text = String(format:"%.1f%", stats.a1C)
+            if UserDefaultsRepository.useIFCC.value {
+                statsEstA1C.text = String(format:"%.0f%", stats.a1C)
+            }
+            else
+            {
+                statsEstA1C.text = String(format:"%.1f%", stats.a1C)
+            }
             statsStdDev.text = String(format:"%.2f%", stats.stdDev)
             
             createStatsPie(pieData: stats.pie)

+ 8 - 0
LoopFollow/Loop Follow.entitlements

@@ -2,9 +2,17 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>com.apple.security.app-sandbox</key>
+	<true/>
 	<key>com.apple.security.application-groups</key>
 	<array>
 		<string>group.com.$(unique_id).LoopFollow</string>
 	</array>
+	<key>com.apple.security.network.client</key>
+	<true/>
+	<key>com.apple.security.personal-information.calendars</key>
+	<true/>
+	<key>com.apple.security.personal-information.photos-library</key>
+	<true/>
 </dict>
 </plist>

+ 18 - 11
LoopFollow/ViewControllers/DebugSettingsViewController.swift

@@ -11,7 +11,7 @@ import Eureka
 import EventKit
 import EventKitUI
 
-class DebugSettingsViewController: FormViewController {
+class AdvancedSettingsViewController: FormViewController {
     
     var appStateController: AppStateController?
     
@@ -20,11 +20,11 @@ class DebugSettingsViewController: FormViewController {
         if UserDefaultsRepository.forceDarkMode.value {
             overrideUserInterfaceStyle = .dark
         }
-        buildDebugSettings()
+        buildAdvancedSettings()
     }
-    private func buildDebugSettings() {
+    private func buildAdvancedSettings() {
         form
-            +++ Section("Debug Settings")
+            +++ Section("Advanced Settings")
             
             <<< SwitchRow("onlyDownloadBG"){ row in
                 row.title = "Only Download BG from NS"
@@ -76,16 +76,23 @@ class DebugSettingsViewController: FormViewController {
                 guard let value = row.value else { return }
                 UserDefaultsRepository.graphOtherTreatments.value = value
             }
+            <<< StepperRow("bgUpdateDelay") { row in
+                row.title = "BG Update Delay (Sec)"
+                row.cell.stepper.stepValue = 1
+                row.cell.stepper.minimumValue = 1
+                row.cell.stepper.maximumValue = 30
+                row.value = Double(UserDefaultsRepository.bgUpdateDelay.value)
+                row.displayValueFor = { value in
+                        guard let value = value else { return nil }
+                        return "\(Int(value))"
+                    }
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.bgUpdateDelay.value = Int(value)
+            }
             
             
             
-            <<< SwitchRow("debugLog"){ row in
-                row.title = "Show Debug Log"
-                row.value = UserDefaultsRepository.debugLog.value
-            }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.debugLog.value = value
-            }
             
             +++ ButtonRow() {
                 $0.title = "DONE"

+ 14 - 4
LoopFollow/ViewControllers/GeneralSettingsViewController.swift

@@ -83,6 +83,19 @@ class GeneralSettingsViewController: FormViewController {
                 appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showStatsChange.rawValue
              }
         }
+        <<< SwitchRow("useIFCC") { row in
+        row.title = "Use IFCC A1C"
+        row.value = UserDefaultsRepository.useIFCC.value
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+            UserDefaultsRepository.useIFCC.value = value
+            
+             // set the appstate to indicate settings change and flags
+             if let appState = self!.appStateController {
+                appState.generalSettingsChanged = true
+                appState.generalSettingsChanges |= GeneralSettingsChangeEnum.useIFCCChange.rawValue
+             }
+        }
         <<< SwitchRow("showSmallGraph") { row in
         row.title = "Display Small Graph"
         row.value = UserDefaultsRepository.showSmallGraph.value
@@ -118,10 +131,7 @@ class GeneralSettingsViewController: FormViewController {
             row.value = UserDefaultsRepository.screenlockSwitchState.value
             }.onChange { [weak self] row in
                 guard let value = row.value else { return }
-                
-                if value {
-                    UserDefaultsRepository.screenlockSwitchState.value = value
-                }
+                UserDefaultsRepository.screenlockSwitchState.value = value
             }
         
         

+ 9 - 4
LoopFollow/ViewControllers/MainViewController.swift

@@ -267,7 +267,12 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             if appState.generalSettingsChanges & GeneralSettingsChangeEnum.showStatsChange.rawValue != 0 {
                statsView.isHidden = !UserDefaultsRepository.showStats.value
             }
-            
+
+            // settings for useIFCC changed
+            if appState.generalSettingsChanges & GeneralSettingsChangeEnum.useIFCCChange.rawValue != 0 {
+                updateStats()
+            }
+
             // settings for showSmallGraph changed
             if appState.generalSettingsChanges & GeneralSettingsChangeEnum.showSmallGraphChange.rawValue != 0 {
                 BGChartFull.isHidden = !UserDefaultsRepository.showSmallGraph.value
@@ -523,7 +528,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             })
         }
         
-        self.sendNotification(self, title: "Watch Face Cleanup", subtitle: "", body: "Delete old watch face graph images", timer: 86400)
+        self.sendGeneralNotification(self, title: "Watch Face Cleanup", subtitle: "", body: "Delete old watch face graph images", timer: 86400)
         
         
     }
@@ -710,7 +715,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     
     // General Notifications
     
-    func sendNotification(_ sender: Any, title: String, subtitle: String, body: String, timer: TimeInterval) {
+    func sendGeneralNotification(_ sender: Any, title: String, subtitle: String, body: String, timer: TimeInterval) {
         
         UNUserNotificationCenter.current().delegate = self
         
@@ -718,7 +723,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         content.title = title
         content.subtitle = subtitle
         content.body = body
-        content.categoryIdentifier = "category"
+        content.categoryIdentifier = "noAction"
         content.sound = .default
         
         let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timer, repeats: false)

+ 1 - 1
LoopFollow/ViewControllers/NightScoutViewController.swift

@@ -88,7 +88,7 @@ extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
         decisionHandler(.allow)
     }
     
-    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
+    func webView(_ webView: WKWebView, shouldStartLoadWith request: URLRequest) -> Bool {
         
         guard let url = request.url else {
             return false

+ 14 - 13
LoopFollow/ViewControllers/SettingsViewController.swift

@@ -174,19 +174,6 @@ class SettingsViewController: FormViewController {
            ), onDismiss: nil)
             
         }
-        
-       +++ Section("Debug Settings")
-        <<< ButtonRow() {
-           $0.title = "Configure Debug"
-           $0.presentationMode = .show(
-               controllerProvider: .callback(builder: {
-                  let controller = DebugSettingsViewController()
-                  controller.appStateController = self.appStateController
-                  return controller
-               }
-           ), onDismiss: nil)
-            
-        }
             <<< LabelRow("Clear Images"){ row in
                 row.title = "Delete Watch Face Images"
             }.onCellSelection{ cell,row  in
@@ -197,6 +184,20 @@ class SettingsViewController: FormViewController {
                     mainScreen.saveChartImage()
                 }
             }
+        
+       +++ Section("Advanced Settings")
+        <<< ButtonRow() {
+           $0.title = "Advanced Settings"
+           $0.presentationMode = .show(
+               controllerProvider: .callback(builder: {
+                  let controller = AdvancedSettingsViewController()
+                  controller.appStateController = self.appStateController
+                  return controller
+               }
+           ), onDismiss: nil)
+            
+        }
+  
     
             +++ Section(header: "App Expiration", footer: String(expiration.description))
     

+ 31 - 24
LoopFollow/ViewControllers/SnoozeViewController.swift

@@ -26,6 +26,8 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
     @IBOutlet weak var MinAgoLabel: UILabel!
     @IBOutlet weak var AlertLabel: UILabel!
     @IBOutlet weak var clockLabel: UILabel!
+    @IBOutlet weak var snoozeForMinuteLabel: UILabel!
+    @IBOutlet weak var snoozeForMinuteStepper: UIStepper!
     
     @IBAction func SnoozeButton(_ sender: Any) {
         AlarmSound.stop()
@@ -44,9 +46,14 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
         AlertLabel.isHidden = true
         SnoozeButton.isHidden = true
         clockLabel.isHidden = false
+        snoozeForMinuteStepper.isHidden = true
+        snoozeForMinuteLabel.isHidden = true
         
     }
     
+    @IBAction func snoozeForMinuteValChanged(_ sender: UIStepper) {
+        snoozeForMinuteLabel.text = Int(sender.value).description
+    }
     
     // Update Time
     func startClockTimer(time: TimeInterval) {
@@ -119,76 +126,76 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
             alarms.reloadIsSnoozed(key: "alertTemporaryActive", value: false)
         } else if AlarmSound.whichAlarm == "Urgent Low Alert" {
             UserDefaultsRepository.alertUrgentLowIsSnoozed.value = true
-            UserDefaultsRepository.alertUrgentLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentLowSnooze.value * 60))
+            UserDefaultsRepository.alertUrgentLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertUrgentLowIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertUrgentLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentLowSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertUrgentLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         } else if AlarmSound.whichAlarm == "Low Alert" {
             UserDefaultsRepository.alertLowIsSnoozed.value = true
-            UserDefaultsRepository.alertLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertLowSnooze.value * 60))
+            UserDefaultsRepository.alertLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertLowIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertLowSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         } else if AlarmSound.whichAlarm == "High Alert" {
             UserDefaultsRepository.alertHighIsSnoozed.value = true
-            UserDefaultsRepository.alertHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertHighSnooze.value * 60))
+            UserDefaultsRepository.alertHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertHighIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertHighSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         } else if AlarmSound.whichAlarm == "Urgent High Alert" {
             UserDefaultsRepository.alertUrgentHighIsSnoozed.value = true
-            UserDefaultsRepository.alertUrgentHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentHighSnooze.value * 60))
+            UserDefaultsRepository.alertUrgentHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertUrgentHighIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertUrgentHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentHighSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertUrgentHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         } else if AlarmSound.whichAlarm == "Fast Drop Alert" {
             UserDefaultsRepository.alertFastDropIsSnoozed.value = true
-            UserDefaultsRepository.alertFastDropSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastDropSnooze.value * 60))
+            UserDefaultsRepository.alertFastDropSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertFastDropIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertFastDropSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastDropSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertFastDropSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         } else if AlarmSound.whichAlarm == "Fast Rise Alert" {
             UserDefaultsRepository.alertFastRiseIsSnoozed.value = true
-            UserDefaultsRepository.alertFastRiseSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastRiseSnooze.value * 60))
+            UserDefaultsRepository.alertFastRiseSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertFastRiseIsSnoozed", value: true)
-            alarms.reloadSnoozeTime(key: "alertFastRiseSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastRiseSnooze.value * 60)))
+            alarms.reloadSnoozeTime(key: "alertFastRiseSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
         }  else if AlarmSound.whichAlarm == "Missed Reading Alert" {
            UserDefaultsRepository.alertMissedReadingIsSnoozed.value = true
-           UserDefaultsRepository.alertMissedReadingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertMissedReadingSnooze.value * 60))
+           UserDefaultsRepository.alertMissedReadingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
            guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
            alarms.reloadIsSnoozed(key: "alertMissedReadingIsSnoozed", value: true)
-           alarms.reloadSnoozeTime(key: "alertMissedReadingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertMissedReadingSnooze.value * 60)))
+           alarms.reloadSnoozeTime(key: "alertMissedReadingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
        }  else if AlarmSound.whichAlarm == "Sensor Change Alert" {
                 UserDefaultsRepository.alertSAGEIsSnoozed.value = true
-                UserDefaultsRepository.alertSAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertSAGESnooze.value * 60 * 60))
+                UserDefaultsRepository.alertSAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
                 guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
                 alarms.reloadIsSnoozed(key: "alertSAGEIsSnoozed", value: true)
-                alarms.reloadSnoozeTime(key: "alertSAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertSAGESnooze.value * 60 * 60)))
+                alarms.reloadSnoozeTime(key: "alertSAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
        } else if AlarmSound.whichAlarm == "Pump Change Alert" {
         UserDefaultsRepository.alertCAGEIsSnoozed.value = true
-        UserDefaultsRepository.alertCAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertCAGESnooze.value * 60 * 60))
+        UserDefaultsRepository.alertCAGESnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
         guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
         alarms.reloadIsSnoozed(key: "alertCAGEIsSnoozed", value: true)
-        alarms.reloadSnoozeTime(key: "alertCAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertCAGESnooze.value * 60 * 60)))
+        alarms.reloadSnoozeTime(key: "alertCAGESnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
        } else if AlarmSound.whichAlarm == "Not Looping Alert" {
         UserDefaultsRepository.alertNotLoopingIsSnoozed.value = true
-        UserDefaultsRepository.alertNotLoopingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertNotLoopingSnooze.value * 60))
+        UserDefaultsRepository.alertNotLoopingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
         guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
         alarms.reloadIsSnoozed(key: "alertNotLoopingIsSnoozed", value: true)
-        alarms.reloadSnoozeTime(key: "alertNotLoopingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertNotLoopingSnooze.value * 60)))
+        alarms.reloadSnoozeTime(key: "alertNotLoopingSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
        } else if AlarmSound.whichAlarm == "Missed Bolus Alert" {
         UserDefaultsRepository.alertMissedBolusIsSnoozed.value = true
-        UserDefaultsRepository.alertMissedBolusSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertMissedBolusSnooze.value * 60))
+        UserDefaultsRepository.alertMissedBolusSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
         guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
         alarms.reloadIsSnoozed(key: "alertMissedBolusIsSnoozed", value: true)
-        alarms.reloadSnoozeTime(key: "alertMissedBolusSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertMissedBolusSnooze.value * 60)))
+        alarms.reloadSnoozeTime(key: "alertMissedBolusSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
        } else if AlarmSound.whichAlarm == "Low Insulin Alert" {
         UserDefaultsRepository.alertPumpIsSnoozed.value = true
-        UserDefaultsRepository.alertPumpSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertPumpSnoozeHours.value * 60 * 60))
+        UserDefaultsRepository.alertPumpSnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60))
         guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
         alarms.reloadIsSnoozed(key: "alertPumpIsSnoozed", value: true)
-        alarms.reloadSnoozeTime(key: "alertPumpSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertPumpSnoozeHours.value * 60 * 60)))
+        alarms.reloadSnoozeTime(key: "alertPumpSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
        }
     }
     

+ 11 - 10
LoopFollow/repository/UserDefaults.swift

@@ -57,6 +57,7 @@ class UserDefaultsRepository {
     // General Settings
     static let colorBGText = UserDefaultsValue<Bool>(key: "colorBGText", default: true)
     static let showStats = UserDefaultsValue<Bool>(key: "showStats", default: true)
+    static let useIFCC = UserDefaultsValue<Bool>(key: "useIFCC", default: false)
     static let showSmallGraph = UserDefaultsValue<Bool>(key: "showSmallGraph", default: true)
     static let speakBG = UserDefaultsValue<Bool>(key: "speakBG", default: false)
     static let backgroundRefreshFrequency = UserDefaultsValue<Double>(key: "backgroundRefreshFrequency", default: 1)
@@ -73,16 +74,16 @@ class UserDefaultsRepository {
             UIApplication.shared.isIdleTimerDisabled = screenlock
     })
     
-    // Debug Settings
-        static let onlyDownloadBG = UserDefaultsValue<Bool>(key: "onlyDownloadBG", default: false)
-        static let downloadTreatments = UserDefaultsValue<Bool>(key: "downloadTreatments", default: true)
-        static let downloadPrediction = UserDefaultsValue<Bool>(key: "downloadPrediction", default: true)
-        static let graphOtherTreatments = UserDefaultsValue<Bool>(key: "graphOtherTreatments", default: true)
-        static let graphBasal = UserDefaultsValue<Bool>(key: "graphBasal", default: true)
-        static let graphBolus = UserDefaultsValue<Bool>(key: "graphBolus", default: true)
-        static let graphCarbs = UserDefaultsValue<Bool>(key: "graphCarbs", default: true)
-        static let debugLog = UserDefaultsValue<Bool>(key: "debugLog", default: false)
-    
+    // Advanced Settings
+    static let onlyDownloadBG = UserDefaultsValue<Bool>(key: "onlyDownloadBG", default: false)
+    static let downloadTreatments = UserDefaultsValue<Bool>(key: "downloadTreatments", default: true)
+    static let downloadPrediction = UserDefaultsValue<Bool>(key: "downloadPrediction", default: true)
+    static let graphOtherTreatments = UserDefaultsValue<Bool>(key: "graphOtherTreatments", default: true)
+    static let graphBasal = UserDefaultsValue<Bool>(key: "graphBasal", default: true)
+    static let graphBolus = UserDefaultsValue<Bool>(key: "graphBolus", default: true)
+    static let graphCarbs = UserDefaultsValue<Bool>(key: "graphCarbs", default: true)
+    static let debugLog = UserDefaultsValue<Bool>(key: "debugLog", default: false)
+    static let bgUpdateDelay = UserDefaultsValue<Int>(key: "bgUpdateDelay", default: 10)
     
     
     // Watch Calendar Settings