Browse Source

Fine Tune Alarms

Jon Fawcett 6 years ago
parent
commit
28fd85233d

+ 3 - 58
LoopFollow/Controllers/AlarmSound.swift

@@ -114,63 +114,8 @@ class AlarmSound {
         }
         }
     }
     }
     
     
-    static func playOnce() {
-        
-        guard !self.isPlaying else {
-            return
-        }
-        
-        do {
-            self.audioPlayer = try AVAudioPlayer(contentsOf: self.soundURL)
-            self.audioPlayer!.delegate = self.audioPlayerDelegate
-            
-            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category(rawValue: convertFromAVAudioSessionCategory(AVAudioSession.Category.playback)))
-            try AVAudioSession.sharedInstance().setActive(true)
-            
-            // Play endless loops
-            self.audioPlayer!.numberOfLoops = 0
-            
-            // Store existing volume
-            if self.systemOutputVolumeBeforeOverride == nil {
-                self.systemOutputVolumeBeforeOverride = AVAudioSession.sharedInstance().outputVolume
-            }
-            
-            // init volume before start playing (mute if fade-in)
-            //self.audioPlayer!.volume = (self.muted || (UserDefaultsRepository.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
-            
-            if !self.audioPlayer!.prepareToPlay() {
-                NSLog("AlarmSound - audio player failed preparing to play")
-            }
-            
-            if self.audioPlayer!.play() {
-                if !self.isPlaying {
-                    NSLog("AlarmSound - not playing after calling play")
-                    NSLog("AlarmSound - rate value: \(self.audioPlayer!.rate)")
-                }
-            } else {
-                NSLog("AlarmSound - audio player failed to play")
-            }
-            
-            
-            // do fade-in
-            //if !self.muted && (UserDefaultsRepository.fadeInTimeInterval.value > 0) {
-            //    self.audioPlayer!.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
-            //}
-            
-            if UserDefaultsRepository.overrideSystemOutputVolume.value {
-                MPVolumeView.setVolume(UserDefaultsRepository.forcedOutputVolume.value)
-            }
-            
-            
-            //self.playingTimer = Timer.schedule(repeatInterval: 1.0, handler: self.onPlayingTimer)
-            
-        } catch let error {
-            NSLog("AlarmSound - unable to play sound; error: \(error)")
-        }
-    }
-    
     
     
-    static func play() {
+    static func play(overrideVolume: Bool, numLoops: Int) {
         
         
         guard !self.isPlaying else {
         guard !self.isPlaying else {
             return
             return
@@ -184,7 +129,7 @@ class AlarmSound {
             try AVAudioSession.sharedInstance().setActive(true)
             try AVAudioSession.sharedInstance().setActive(true)
             
             
             // Play endless loops
             // Play endless loops
-            self.audioPlayer!.numberOfLoops = -1
+            self.audioPlayer!.numberOfLoops = numLoops
             
             
             // Store existing volume
             // Store existing volume
             if self.systemOutputVolumeBeforeOverride == nil {
             if self.systemOutputVolumeBeforeOverride == nil {
@@ -213,7 +158,7 @@ class AlarmSound {
             //    self.audioPlayer!.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
             //    self.audioPlayer!.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
             //}
             //}
             
             
-            if UserDefaultsRepository.overrideSystemOutputVolume.value {
+            if overrideVolume {
                 MPVolumeView.setVolume(UserDefaultsRepository.forcedOutputVolume.value)
                 MPVolumeView.setVolume(UserDefaultsRepository.forcedOutputVolume.value)
             }
             }
             
             

+ 39 - 22
LoopFollow/Controllers/Alarms.swift

@@ -28,7 +28,7 @@ extension MainViewController {
                ] else {}
                ] else {}
            let currentBGTime = bgs[bgs.count - 1].date
            let currentBGTime = bgs[bgs.count - 1].date
            var alarmTriggered = false
            var alarmTriggered = false
-           
+           var numLoops = 0
            clearOldSnoozes()
            clearOldSnoozes()
            
            
            // Exit if all is snoozed
            // Exit if all is snoozed
@@ -49,14 +49,16 @@ extension MainViewController {
                        if Float(currentBG) < UserDefaultsRepository.alertTemporaryBG.value {
                        if Float(currentBG) < UserDefaultsRepository.alertTemporaryBG.value {
                            UserDefaultsRepository.alertTemporaryActive.value = false
                            UserDefaultsRepository.alertTemporaryActive.value = false
                            AlarmSound.whichAlarm = "Temporary Alert"
                            AlarmSound.whichAlarm = "Temporary Alert"
-                           triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime)
+                        if UserDefaultsRepository.alertTemporaryBGRepeat.value { numLoops = -1 }
+                           triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertTemporaryBGDND.value, numLoops: numLoops)
                            return
                            return
                        }
                        }
                    } else{
                    } else{
                        if Float(currentBG) > UserDefaultsRepository.alertTemporaryBG.value {
                        if Float(currentBG) > UserDefaultsRepository.alertTemporaryBG.value {
                          tabBarController?.selectedIndex = 2
                          tabBarController?.selectedIndex = 2
                            AlarmSound.whichAlarm = "Temporary Alert"
                            AlarmSound.whichAlarm = "Temporary Alert"
-                           triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime)
+                        if UserDefaultsRepository.alertTemporaryBGRepeat.value { numLoops = -1 }
+                           triggerAlarm(sound: UserDefaultsRepository.alertTemporarySound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertTemporaryBGDND.value, numLoops: numLoops)
                            return
                            return
                       }
                       }
                    }
                    }
@@ -68,7 +70,8 @@ extension MainViewController {
                    // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low
                    // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low
                    if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
                    if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
                        AlarmSound.whichAlarm = "Urgent Low Alert"
                        AlarmSound.whichAlarm = "Urgent Low Alert"
-                       triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime)
+                    if UserDefaultsRepository.alertUrgentLowRepeat.value { numLoops = -1 }
+                       triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertUrgentLowDND.value, numLoops: numLoops)
                        return
                        return
                    } else {
                    } else {
                        return
                        return
@@ -79,7 +82,8 @@ extension MainViewController {
                if UserDefaultsRepository.alertLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value &&
                if UserDefaultsRepository.alertLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value &&
                Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value {
                Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value {
                    AlarmSound.whichAlarm = "Low Alert"
                    AlarmSound.whichAlarm = "Low Alert"
-                   triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime)
+                if UserDefaultsRepository.alertLowRepeat.value { numLoops = -1 }
+                   triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertLowDND.value, numLoops: numLoops)
                    return
                    return
                }
                }
                
                
@@ -89,7 +93,8 @@ extension MainViewController {
                    // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent high
                    // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent high
                    if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
                    if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
                            AlarmSound.whichAlarm = "Urgent High Alert"
                            AlarmSound.whichAlarm = "Urgent High Alert"
-                           triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime)
+                    if UserDefaultsRepository.alertUrgentHighRepeat.value { numLoops = -1 }
+                           triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertUrgentHighDND.value, numLoops: numLoops)
                            return
                            return
                    } else {
                    } else {
                        return
                        return
@@ -106,7 +111,8 @@ extension MainViewController {
                    Float(persistentBG) >= UserDefaultsRepository.alertHighBG.value &&
                    Float(persistentBG) >= UserDefaultsRepository.alertHighBG.value &&
                    !UserDefaultsRepository.alertHighIsSnoozed.value {
                    !UserDefaultsRepository.alertHighIsSnoozed.value {
                        AlarmSound.whichAlarm = "High Alert"
                        AlarmSound.whichAlarm = "High Alert"
-                       triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime)
+                if UserDefaultsRepository.alertHighRepeat.value { numLoops = -1 }
+                       triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertHighDND.value, numLoops: numLoops)
                        return
                        return
                }
                }
                
                
@@ -123,7 +129,8 @@ extension MainViewController {
                        || (UserDefaultsRepository.alertFastDropReadings.value == 3 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare)
                        || (UserDefaultsRepository.alertFastDropReadings.value == 3 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare)
                        || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) {
                        || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) {
                            AlarmSound.whichAlarm = "Fast Drop Alert"
                            AlarmSound.whichAlarm = "Fast Drop Alert"
-                           triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime)
+                        if UserDefaultsRepository.alertFastDropRepeat.value { numLoops = -1 }
+                           triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertFastDropDND.value, numLoops: numLoops)
                            return
                            return
                        }
                        }
                    }
                    }
@@ -140,7 +147,8 @@ extension MainViewController {
                        || (UserDefaultsRepository.alertFastRiseReadings.value == 3 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare)
                        || (UserDefaultsRepository.alertFastRiseReadings.value == 3 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare)
                        || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) {
                        || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) {
                            AlarmSound.whichAlarm = "Fast Rise Alert"
                            AlarmSound.whichAlarm = "Fast Rise Alert"
-                           triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime)
+                        if UserDefaultsRepository.alertFastRiseRepeat.value { numLoops = -1 }
+                           triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.alertFastRiseDND.value, numLoops: numLoops)
                            return
                            return
                        }
                        }
                    }
                    }
@@ -166,7 +174,8 @@ extension MainViewController {
                    ) ||
                    ) ||
                    !UserDefaultsRepository.alertNotLoopingUseLimits.value) {
                    !UserDefaultsRepository.alertNotLoopingUseLimits.value) {
                        AlarmSound.whichAlarm = "Not Looping Alert"
                        AlarmSound.whichAlarm = "Not Looping Alert"
-                       triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil)
+                if UserDefaultsRepository.alertNotLoopingRepeat.value { numLoops = -1 }
+                       triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertNotLoopingDND.value, numLoops: numLoops)
                        return
                        return
                }
                }
            }
            }
@@ -191,7 +200,8 @@ extension MainViewController {
                 // There is a current carb but no boluses data at all
                 // There is a current carb but no boluses data at all
                 if bolusData.count < 1 {
                 if bolusData.count < 1 {
                     AlarmSound.whichAlarm = "Missed Bolus Alert"
                     AlarmSound.whichAlarm = "Missed Bolus Alert"
-                    triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil)
+                    if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
+                    triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedBolusDND.value, numLoops: numLoops)
                     return
                     return
                 }
                 }
                 
                 
@@ -214,7 +224,8 @@ extension MainViewController {
                 // This will trigger is no boluses were set above
                 // This will trigger is no boluses were set above
                 if (lastBolus == 0.0) {
                 if (lastBolus == 0.0) {
                     AlarmSound.whichAlarm = "Missed Bolus Alert"
                     AlarmSound.whichAlarm = "Missed Bolus Alert"
-                    triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil)
+                    if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
+                    triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedBolusDND.value, numLoops: numLoops)
                     return
                     return
                 }
                 }
                     
                     
@@ -225,7 +236,8 @@ extension MainViewController {
            //check for missed reading alert
            //check for missed reading alert
            if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) {
            if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) {
                AlarmSound.whichAlarm = "Missed Reading Alert"
                AlarmSound.whichAlarm = "Missed Reading Alert"
-                   triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil)
+            if UserDefaultsRepository.alertMissedReadingRepeat.value { numLoops = -1 }
+                   triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertMissedReadingDND.value, numLoops: numLoops)
                    return
                    return
            }
            }
            
            
@@ -237,7 +249,8 @@ extension MainViewController {
                let tenDays = 10 * 24 * 60 * 60
                let tenDays = 10 * 24 * 60 * 60
                if Double(tenDays) - Double(delta) <= alertDistance {
                if Double(tenDays) - Double(delta) <= alertDistance {
                    AlarmSound.whichAlarm = "Sensor Change Alert"
                    AlarmSound.whichAlarm = "Sensor Change Alert"
-                   triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil)
+                if UserDefaultsRepository.alertSAGERepeat.value { numLoops = -1 }
+                   triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertSAGEDND.value, numLoops: numLoops)
                    return
                    return
                }
                }
            }
            }
@@ -250,7 +263,8 @@ extension MainViewController {
                let tenDays = 3 * 24 * 60 * 60
                let tenDays = 3 * 24 * 60 * 60
                if Double(tenDays) - Double(delta) <= alertDistance {
                if Double(tenDays) - Double(delta) <= alertDistance {
                    AlarmSound.whichAlarm = "Pump Change Alert"
                    AlarmSound.whichAlarm = "Pump Change Alert"
-                   triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil)
+                if UserDefaultsRepository.alertCAGERepeat.value { numLoops = -1 }
+                triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.alertCAGEDND.value, numLoops: numLoops)
                    return
                    return
                }
                }
            }
            }
@@ -280,30 +294,33 @@ extension MainViewController {
         // make sure values are not the same
         // make sure values are not the same
         if latest.value == prior.value { return }
         if latest.value == prior.value { return }
         
         
+        var numLoops = 0
         if UserDefaultsRepository.alertOverrideStart.value {
         if UserDefaultsRepository.alertOverrideStart.value {
             if latest.value != 1.0 && lastOverrideStartTime != latest.date {
             if latest.value != 1.0 && lastOverrideStartTime != latest.date {
-                AlarmSound.whichAlarm = String(format: "%.0f%%", latest.value) + " Override Started"
-                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideStartSound.value)
+                AlarmSound.whichAlarm = String(format: "%.0f%%", (latest.value * 100)) + " Override Started"
+                if UserDefaultsRepository.alertOverrideStartRepeat.value { numLoops = -1 }
+                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.alertOverrideStartDND.value, numLoops: numLoops)
                 lastOverrideStartTime = latest.date
                 lastOverrideStartTime = latest.date
             }
             }
         } else if UserDefaultsRepository.alertOverrideEnd.value {
         } else if UserDefaultsRepository.alertOverrideEnd.value {
             if latest.value == 1.0 && lastOverrideEndTime != latest.date {
             if latest.value == 1.0 && lastOverrideEndTime != latest.date {
                 AlarmSound.whichAlarm = "Override Ended"
                 AlarmSound.whichAlarm = "Override Ended"
-                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value)
+                if UserDefaultsRepository.alertOverrideEndRepeat.value { numLoops = -1 }
+                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.alertOverrideEndDND.value, numLoops: numLoops)
                 lastOverrideEndTime = latest.date
                 lastOverrideEndTime = latest.date
             }
             }
         }
         }
     }
     }
     
     
-    func triggerOneTimeAlarm(sound: String)
+    func triggerOneTimeAlarm(sound: String, overrideVolume: Bool, numLoops: Int)
     {
     {
         guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
         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.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
         AlarmSound.setSoundFile(str: sound)
         AlarmSound.setSoundFile(str: sound)
-        AlarmSound.playOnce()
+        AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
     }
     }
     
     
-    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?)
+    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?, overrideVolume: Bool, numLoops: Int)
     {
     {
         guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
         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.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
@@ -315,7 +332,7 @@ extension MainViewController {
             UserDefaultsRepository.snoozedBGReadingTime.value = snooozedBGReadingTime
             UserDefaultsRepository.snoozedBGReadingTime.value = snooozedBGReadingTime
         }
         }
         AlarmSound.setSoundFile(str: sound)
         AlarmSound.setSoundFile(str: sound)
-        AlarmSound.play()
+        AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
     }
     }
     
     
     func clearOldSnoozes(){
     func clearOldSnoozes(){

+ 421 - 191
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -255,7 +255,7 @@ class AlarmViewController: FormViewController {
         
         
         buildSnoozeAll()
         buildSnoozeAll()
         buildAppInactive()
         buildAppInactive()
-        
+        buildAlarmSettings()
         
         
     }
     }
 
 
@@ -308,54 +308,68 @@ class AlarmViewController: FormViewController {
     
     
     func buildTemporaryAlert(){
     func buildTemporaryAlert(){
         form
         form
-
-
-        +++ Section(header: "Temporary Alert", footer: "Temporary Alert will trigger once and disable. Disabling Alert Below BG will trigger it as a high alert above the BG.") { row in
-                                  row.hidden = "$bgExtraAlerts != 'Temporary'"
-                              }
-                   <<< SwitchRow("alertTemporaryActive"){ row in
-                       row.title = "Active"
-                       row.value = UserDefaultsRepository.alertTemporaryActive.value
-                       }.onChange { [weak self] row in
-                               guard let value = row.value else { return }
-                               UserDefaultsRepository.alertTemporaryActive.value = value
-                       }
-                        <<< SwitchRow("alertTemporaryBelow"){ row in
-                        row.title = "Alert Below BG"
-                        row.value = UserDefaultsRepository.alertTemporaryBelow.value
-                        }.onChange { [weak self] row in
-                                guard let value = row.value else { return }
-                                UserDefaultsRepository.alertTemporaryBelow.value = value
-                        }
-                   <<< StepperRow("alertTemporaryBG") { row in
-                       row.title = "BG"
-                       row.cell.stepper.stepValue = 1
-                       row.cell.stepper.minimumValue = 40
-                       row.cell.stepper.maximumValue = 400
-                       row.value = Double(UserDefaultsRepository.alertTemporaryBG.value)
-                       row.displayValueFor = { value in
-                           guard let value = value else { return nil }
-                           return bgUnits.toDisplayUnits(String(value))
-                       }
-                   }.onChange { [weak self] row in
-                           guard let value = row.value else { return }
-                           UserDefaultsRepository.alertTemporaryBG.value = Float(value)
-                   }
-                    <<< PickerInputRow<String>("alertTemporarySound") { row in
-                        row.title = "Sound"
-                        row.options = soundFiles
-                        row.value = UserDefaultsRepository.alertTemporarySound.value
-                        row.displayValueFor = { value in
-                        guard let value = value else { return nil }
-                            return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
-                        }
-                    }.onChange { [weak self] row in
-                            guard let value = row.value else { return }
-                            UserDefaultsRepository.alertTemporarySound.value = value
-                        AlarmSound.setSoundFile(str: value)
-                        AlarmSound.stop()
-                        AlarmSound.playTest()
-                    }
+            
+            
+            +++ Section(header: "Temporary Alert", footer: "Temporary Alert will trigger once and disable. Disabling Alert Below BG will trigger it as a high alert above the BG.") { row in
+                row.hidden = "$bgExtraAlerts != 'Temporary'"
+            }
+            <<< SwitchRow("alertTemporaryActive"){ row in
+                row.title = "Active"
+                row.value = UserDefaultsRepository.alertTemporaryActive.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporaryActive.value = value
+            }
+            <<< SwitchRow("alertTemporaryBelow"){ row in
+                row.title = "Alert Below BG"
+                row.value = UserDefaultsRepository.alertTemporaryBelow.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporaryBelow.value = value
+            }
+            <<< StepperRow("alertTemporaryBG") { row in
+                row.title = "BG"
+                row.cell.stepper.stepValue = 1
+                row.cell.stepper.minimumValue = 40
+                row.cell.stepper.maximumValue = 400
+                row.value = Double(UserDefaultsRepository.alertTemporaryBG.value)
+                row.displayValueFor = { value in
+                    guard let value = value else { return nil }
+                    return bgUnits.toDisplayUnits(String(value))
+                }
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporaryBG.value = Float(value)
+            }
+            <<< PickerInputRow<String>("alertTemporarySound") { row in
+                row.title = "Sound"
+                row.options = soundFiles
+                row.value = UserDefaultsRepository.alertTemporarySound.value
+                row.displayValueFor = { value in
+                    guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporarySound.value = value
+                AlarmSound.setSoundFile(str: value)
+                AlarmSound.stop()
+                AlarmSound.playTest()
+        }
+        <<< SwitchRow("alertTempoaryDND"){ row in
+        row.title = "Override System Volume"
+        row.value = UserDefaultsRepository.alertTemporaryBGDND.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporaryBGDND.value = value
+        }
+        <<< SwitchRow("alertTemporaryRepeat"){ row in
+        row.title = "Repeat Sound"
+        row.value = UserDefaultsRepository.alertTemporaryBGRepeat.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertTemporaryBGRepeat.value = value
+        }
     }
     }
     
     
     func buildUrgentLow(){
     func buildUrgentLow(){
@@ -413,6 +427,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertUrgentLowDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertUrgentLowDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertUrgentLowDND.value = value
+            }
+            <<< SwitchRow("alertUrgentLowRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertUrgentLowRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertUrgentLowRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertUrgentLowSnoozedTime") { row in
         <<< DateTimeInlineRow("alertUrgentLowSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
             
             
@@ -512,6 +540,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertLowDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertLowDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertLowDND.value = value
+            }
+            <<< SwitchRow("alertLowRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertLowRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertLowRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertLowSnoozedTime") { row in
         <<< DateTimeInlineRow("alertLowSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertLowSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertLowSnoozedTime.value != nil) {
@@ -625,6 +667,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertHighDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertHighDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertHighDND.value = value
+            }
+            <<< SwitchRow("alertHighRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertHighRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertHighRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertHighSnoozedTime") { row in
         <<< DateTimeInlineRow("alertHighSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
             if (UserDefaultsRepository.alertHighSnoozedTime.value != nil) {
             if (UserDefaultsRepository.alertHighSnoozedTime.value != nil) {
@@ -722,6 +778,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertUrgentHighDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertUrgentHighDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertUrgentHighDND.value = value
+            }
+            <<< SwitchRow("alertUrgentHighRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertUrgentHighRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertUrgentHighRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertUrgentHighSnoozedTime") { row in
         <<< DateTimeInlineRow("alertUrgentHighSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
             if (UserDefaultsRepository.alertUrgentHighSnoozedTime.value != nil) {
             if (UserDefaultsRepository.alertUrgentHighSnoozedTime.value != nil) {
@@ -856,6 +926,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertFastDropDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertFastDropDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertFastDropDND.value = value
+            }
+            <<< SwitchRow("alertFastDropRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertFastDropRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertFastDropRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertFastDropSnoozedTime") { row in
         <<< DateTimeInlineRow("alertFastDropSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertFastDropSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertFastDropSnoozedTime.value != nil) {
@@ -990,6 +1074,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertFastRiseDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertFastRiseDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertFastRiseDND.value = value
+            }
+            <<< SwitchRow("alertFastRiseRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertFastRiseRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertFastRiseRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertFastRiseSnoozedTime") { row in
         <<< DateTimeInlineRow("alertFastRiseSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertFastRiseSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertFastRiseSnoozedTime.value != nil) {
@@ -1089,6 +1187,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertMissedReadingDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertMissedReadingDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMissedReadingDND.value = value
+            }
+            <<< SwitchRow("alertMissedReadingRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertMissedReadingRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMissedReadingRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertMissedReadingSnoozedTime") { row in
         <<< DateTimeInlineRow("alertMissedReadingSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertMissedReadingSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertMissedReadingSnoozedTime.value != nil) {
@@ -1224,6 +1336,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertNotLoopingDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertNotLoopingDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertNotLoopingDND.value = value
+            }
+            <<< SwitchRow("alertNotLoopingRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertNotLoopingRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertNotLoopingRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertNotLoopingSnoozedTime") { row in
         <<< DateTimeInlineRow("alertNotLoopingSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertNotLoopingSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertNotLoopingSnoozedTime.value != nil) {
@@ -1378,6 +1504,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
+            <<< SwitchRow("alertMissedBolusDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertMissedBolusDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMissedBolusDND.value = value
+            }
+            <<< SwitchRow("alertMissedBolusRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertMissedBolusRepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMissedBolusRepeat.value = value
+            }
         <<< DateTimeInlineRow("alertMissedBolusSnoozedTime") { row in
         <<< DateTimeInlineRow("alertMissedBolusSnoozedTime") { row in
             row.title = "Snoozed Until"
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertMissedBolusSnoozedTime.value != nil) {
            if (UserDefaultsRepository.alertMissedBolusSnoozedTime.value != nil) {
@@ -1433,19 +1573,19 @@ class AlarmViewController: FormViewController {
     }
     }
     
     
     func buildSage(){
     func buildSage(){
-            form
-                +++ Section(header: "Sensor Change Reminder", footer: "Alert for 10 Day Sensor Change. Values are in Hours.") { row in
-                                   row.hidden = "$otherAlerts != 'SAGE'"
-                               }
-        
+        form
+            +++ Section(header: "Sensor Change Reminder", footer: "Alert for 10 Day Sensor Change. Values are in Hours.") { row in
+                row.hidden = "$otherAlerts != 'SAGE'"
+            }
+            
             <<< SwitchRow("alertSAGEActive"){ row in
             <<< SwitchRow("alertSAGEActive"){ row in
-                    row.title = "Active"
-                    row.value = UserDefaultsRepository.alertSAGEActive.value
-                    }.onChange { [weak self] row in
-                            guard let value = row.value else { return }
-                            UserDefaultsRepository.alertSAGEActive.value = value
-                    }
-        
+                row.title = "Active"
+                row.value = UserDefaultsRepository.alertSAGEActive.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertSAGEActive.value = value
+            }
+            
             <<< StepperRow("alertSAGE") { row in
             <<< StepperRow("alertSAGE") { row in
                 row.title = "Time"
                 row.title = "Time"
                 row.cell.stepper.stepValue = 1
                 row.cell.stepper.stepValue = 1
@@ -1453,12 +1593,12 @@ class AlarmViewController: FormViewController {
                 row.cell.stepper.maximumValue = 24
                 row.cell.stepper.maximumValue = 24
                 row.value = Double(UserDefaultsRepository.alertSAGE.value)
                 row.value = Double(UserDefaultsRepository.alertSAGE.value)
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                        guard let value = value else { return nil }
-                        return "\(Int(value))"
-                    }
+                    guard let value = value else { return nil }
+                    return "\(Int(value))"
+                }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertSAGE.value = Int(value)
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertSAGE.value = Int(value)
             }
             }
             <<< StepperRow("alertSAGESnooze") { row in
             <<< StepperRow("alertSAGESnooze") { row in
                 row.title = "Snooze"
                 row.title = "Snooze"
@@ -1467,35 +1607,50 @@ class AlarmViewController: FormViewController {
                 row.cell.stepper.maximumValue = 24
                 row.cell.stepper.maximumValue = 24
                 row.value = Double(UserDefaultsRepository.alertSAGESnooze.value)
                 row.value = Double(UserDefaultsRepository.alertSAGESnooze.value)
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                        guard let value = value else { return nil }
-                        return "\(Int(value))"
-                    }
+                    guard let value = value else { return nil }
+                    return "\(Int(value))"
+                }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertSAGESnooze.value = Int(value)
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertSAGESnooze.value = Int(value)
             }
             }
-                <<< PickerInputRow<String>("alertSAGESound") { row in
-                    row.title = "Sound"
-                    row.options = soundFiles
-                    row.value = UserDefaultsRepository.alertSAGESound.value
-                    row.displayValueFor = { value in
+            
+            <<< PickerInputRow<String>("alertSAGESound") { row in
+                row.title = "Sound"
+                row.options = soundFiles
+                row.value = UserDefaultsRepository.alertSAGESound.value
+                row.displayValueFor = { value in
                     guard let value = value else { return nil }
                     guard let value = value else { return nil }
-                        return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
-                    }
-                }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.alertSAGESound.value = value
-                    AlarmSound.setSoundFile(str: value)
-                    AlarmSound.stop()
-                    AlarmSound.playTest()
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                 }
                 }
-        <<< DateTimeInlineRow("alertSAGESnoozedTime") { row in
-            row.title = "Snoozed Until"
-           if (UserDefaultsRepository.alertSAGESnoozedTime.value != nil) {
-                row.value = UserDefaultsRepository.alertSAGESnoozedTime.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertSAGESound.value = value
+                AlarmSound.setSoundFile(str: value)
+                AlarmSound.stop()
+                AlarmSound.playTest()
             }
             }
-            row.minuteInterval = 5
-            row.noValueDisplayText = "Not Snoozed"
+            <<< SwitchRow("alertSAGEDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertSAGEDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertSAGEDND.value = value
+            }
+            <<< SwitchRow("alertSAGERepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertSAGERepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertSAGERepeat.value = value
+            }
+            <<< DateTimeInlineRow("alertSAGESnoozedTime") { row in
+                row.title = "Snoozed Until"
+                if (UserDefaultsRepository.alertSAGESnoozedTime.value != nil) {
+                    row.value = UserDefaultsRepository.alertSAGESnoozedTime.value
+                }
+                row.minuteInterval = 5
+                row.noValueDisplayText = "Not Snoozed"
             }
             }
             .onChange { [weak self] row in
             .onChange { [weak self] row in
                 guard let value = row.value else { return }
                 guard let value = row.value else { return }
@@ -1514,19 +1669,19 @@ class AlarmViewController: FormViewController {
                     cell.detailTextLabel?.textColor = color
                     cell.detailTextLabel?.textColor = color
                 }
                 }
                 cell.detailTextLabel?.textColor = cell.tintColor
                 cell.detailTextLabel?.textColor = cell.tintColor
-        }
-        <<< SwitchRow("alertSAGEIsSnoozed"){ row in
-            row.title = "Is Snoozed"
-            row.value = UserDefaultsRepository.alertSAGEIsSnoozed.value
-            row.hidden = "$alertSAGESnoozedTime == nil"
-        }.onChange { [weak self] row in
+            }
+            <<< SwitchRow("alertSAGEIsSnoozed"){ row in
+                row.title = "Is Snoozed"
+                row.value = UserDefaultsRepository.alertSAGEIsSnoozed.value
+                row.hidden = "$alertSAGESnoozedTime == nil"
+            }.onChange { [weak self] row in
                 guard let value = row.value else { return }
                 guard let value = row.value else { return }
                 UserDefaultsRepository.alertSAGEIsSnoozed.value = value
                 UserDefaultsRepository.alertSAGEIsSnoozed.value = value
                 if !value {
                 if !value {
                     UserDefaultsRepository.alertSAGESnoozedTime.setNil(key: "alertSAGESnoozedTime")
                     UserDefaultsRepository.alertSAGESnoozedTime.setNil(key: "alertSAGESnoozedTime")
                     let otherRow = self?.form.rowBy(tag: "alertSAGESnoozedTime") as! DateTimeInlineRow
                     let otherRow = self?.form.rowBy(tag: "alertSAGESnoozedTime") as! DateTimeInlineRow
-                   otherRow.value = nil
-                   otherRow.reload()
+                    otherRow.value = nil
+                    otherRow.reload()
                 }
                 }
         }
         }
     }
     }
@@ -1534,16 +1689,16 @@ class AlarmViewController: FormViewController {
     func buildCage(){
     func buildCage(){
         form
         form
             +++ Section(header: "Pump/Canula Change Reminder", footer: "Alert for Canula Change. Values are in Hours.") { row in
             +++ Section(header: "Pump/Canula Change Reminder", footer: "Alert for Canula Change. Values are in Hours.") { row in
-                               row.hidden = "$otherAlerts != 'CAGE'"
-                           }
-        <<< SwitchRow("alertCAGEActive"){ row in
-                    row.title = "Active"
-                    row.value = UserDefaultsRepository.alertCAGEActive.value
-                    }.onChange { [weak self] row in
-                            guard let value = row.value else { return }
-                            UserDefaultsRepository.alertCAGEActive.value = value
-                    }
-        
+                row.hidden = "$otherAlerts != 'CAGE'"
+            }
+            <<< SwitchRow("alertCAGEActive"){ row in
+                row.title = "Active"
+                row.value = UserDefaultsRepository.alertCAGEActive.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGEActive.value = value
+            }
+            
             <<< StepperRow("alertCAGE") { row in
             <<< StepperRow("alertCAGE") { row in
                 row.title = "Time"
                 row.title = "Time"
                 row.cell.stepper.stepValue = 1
                 row.cell.stepper.stepValue = 1
@@ -1551,12 +1706,12 @@ class AlarmViewController: FormViewController {
                 row.cell.stepper.maximumValue = 24
                 row.cell.stepper.maximumValue = 24
                 row.value = Double(UserDefaultsRepository.alertCAGE.value)
                 row.value = Double(UserDefaultsRepository.alertCAGE.value)
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                        guard let value = value else { return nil }
-                        return "\(Int(value))"
-                    }
+                    guard let value = value else { return nil }
+                    return "\(Int(value))"
+                }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertCAGE.value = Int(value)
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGE.value = Int(value)
             }
             }
             <<< StepperRow("alertCAGESnooze") { row in
             <<< StepperRow("alertCAGESnooze") { row in
                 row.title = "Snooze"
                 row.title = "Snooze"
@@ -1565,132 +1720,207 @@ class AlarmViewController: FormViewController {
                 row.cell.stepper.maximumValue = 24
                 row.cell.stepper.maximumValue = 24
                 row.value = Double(UserDefaultsRepository.alertCAGESnooze.value)
                 row.value = Double(UserDefaultsRepository.alertCAGESnooze.value)
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                        guard let value = value else { return nil }
-                        return "\(Int(value))"
-                    }
+                    guard let value = value else { return nil }
+                    return "\(Int(value))"
+                }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertCAGESnooze.value = Int(value)
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGESnooze.value = Int(value)
             }
             }
             <<< PickerInputRow<String>("alertCAGESound") { row in
             <<< PickerInputRow<String>("alertCAGESound") { row in
                 row.title = "Sound"
                 row.title = "Sound"
                 row.options = soundFiles
                 row.options = soundFiles
                 row.value = UserDefaultsRepository.alertCAGESound.value
                 row.value = UserDefaultsRepository.alertCAGESound.value
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                guard let value = value else { return nil }
+                    guard let value = value else { return nil }
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                 }
                 }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertCAGESound.value = value
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGESound.value = value
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
             }
             }
-        <<< DateTimeInlineRow("alertCAGESnoozedTime") { row in
-                   row.title = "Snoozed Until"
-                  if (UserDefaultsRepository.alertCAGESnoozedTime.value != nil) {
-                       row.value = UserDefaultsRepository.alertCAGESnoozedTime.value
-                   }
-                   row.minuteInterval = 5
-                   row.noValueDisplayText = "Not Snoozed"
-                   }
-                   .onChange { [weak self] row in
-                       guard let value = row.value else { return }
-                       UserDefaultsRepository.alertCAGESnoozedTime.value = value
-                       UserDefaultsRepository.alertCAGEIsSnoozed.value = true
-                       let otherRow = self?.form.rowBy(tag: "alertCAGEIsSnoozed") as! SwitchRow
-                       otherRow.value = true
-                       otherRow.reload()
-                   }
-                   .onExpandInlineRow { [weak self] cell, row, inlineRow in
-                       inlineRow.cellUpdate() { cell, row in
-                           cell.datePicker.datePickerMode = .dateAndTime
-                       }
-                       let color = cell.detailTextLabel?.textColor
-                       row.onCollapseInlineRow { cell, _, _ in
-                           cell.detailTextLabel?.textColor = color
-                       }
-                       cell.detailTextLabel?.textColor = cell.tintColor
-               }
-               <<< SwitchRow("alertCAGEIsSnoozed"){ row in
-                   row.title = "Is Snoozed"
-                   row.value = UserDefaultsRepository.alertCAGEIsSnoozed.value
-                   row.hidden = "$alertCAGESnoozedTime == nil"
-               }.onChange { [weak self] row in
-                       guard let value = row.value else { return }
-                       UserDefaultsRepository.alertCAGEIsSnoozed.value = value
-                       if !value {
-                           UserDefaultsRepository.alertCAGESnoozedTime.setNil(key: "alertCAGESnoozedTime")
-                           let otherRow = self?.form.rowBy(tag: "alertCAGESnoozedTime") as! DateTimeInlineRow
-                          otherRow.value = nil
-                          otherRow.reload()
-                       }
-               }
+            <<< SwitchRow("alertCAGEDND"){ row in
+            row.title = "Override System Volume"
+            row.value = UserDefaultsRepository.alertCAGEDND.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertCAGEDND.value = value
+            }
+            <<< SwitchRow("alertCAGERepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertCAGERepeat.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertCAGERepeat.value = value
+            }
+            <<< DateTimeInlineRow("alertCAGESnoozedTime") { row in
+                row.title = "Snoozed Until"
+                if (UserDefaultsRepository.alertCAGESnoozedTime.value != nil) {
+                    row.value = UserDefaultsRepository.alertCAGESnoozedTime.value
+                }
+                row.minuteInterval = 5
+                row.noValueDisplayText = "Not Snoozed"
+            }
+            .onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGESnoozedTime.value = value
+                UserDefaultsRepository.alertCAGEIsSnoozed.value = true
+                let otherRow = self?.form.rowBy(tag: "alertCAGEIsSnoozed") as! SwitchRow
+                otherRow.value = true
+                otherRow.reload()
+            }
+            .onExpandInlineRow { [weak self] cell, row, inlineRow in
+                inlineRow.cellUpdate() { cell, row in
+                    cell.datePicker.datePickerMode = .dateAndTime
+                }
+                let color = cell.detailTextLabel?.textColor
+                row.onCollapseInlineRow { cell, _, _ in
+                    cell.detailTextLabel?.textColor = color
+                }
+                cell.detailTextLabel?.textColor = cell.tintColor
+            }
+            <<< SwitchRow("alertCAGEIsSnoozed"){ row in
+                row.title = "Is Snoozed"
+                row.value = UserDefaultsRepository.alertCAGEIsSnoozed.value
+                row.hidden = "$alertCAGESnoozedTime == nil"
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertCAGEIsSnoozed.value = value
+                if !value {
+                    UserDefaultsRepository.alertCAGESnoozedTime.setNil(key: "alertCAGESnoozedTime")
+                    let otherRow = self?.form.rowBy(tag: "alertCAGESnoozedTime") as! DateTimeInlineRow
+                    otherRow.value = nil
+                    otherRow.reload()
+                }
+        }
     }
     }
     
     
     func buildOverrideStart(){
     func buildOverrideStart(){
         form
         form
             +++ Section(header: "Override Started Alert", footer: "Alert will trigger without repeat once when override is activated. There is no need to snooze this alert") { row in
             +++ Section(header: "Override Started Alert", footer: "Alert will trigger without repeat once when override is activated. There is no need to snooze this alert") { row in
-                               row.hidden = "$overrideAlerts != 'Override Start'"
-                           }
-        <<< SwitchRow("alertOverrideStart"){ row in
-                    row.title = "Active"
-                    row.value = UserDefaultsRepository.alertOverrideStart.value
-                    }.onChange { [weak self] row in
-                            guard let value = row.value else { return }
-                            UserDefaultsRepository.alertOverrideStart.value = value
-                    }
-        
+                row.hidden = "$overrideAlerts != 'Override Start'"
+            }
+            <<< SwitchRow("alertOverrideStart"){ row in
+                row.title = "Active"
+                row.value = UserDefaultsRepository.alertOverrideStart.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideStart.value = value
+            }
+            
             <<< PickerInputRow<String>("alertOverrideStartSound") { row in
             <<< PickerInputRow<String>("alertOverrideStartSound") { row in
                 row.title = "Sound"
                 row.title = "Sound"
                 row.options = soundFiles
                 row.options = soundFiles
                 row.value = UserDefaultsRepository.alertOverrideStartSound.value
                 row.value = UserDefaultsRepository.alertOverrideStartSound.value
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                guard let value = value else { return nil }
+                    guard let value = value else { return nil }
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                 }
                 }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertOverrideStartSound.value = value
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideStartSound.value = value
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
-            }
-       
+        }
+        <<< SwitchRow("alertOverrideStartDND"){ row in
+        row.title = "Override System Volume"
+        row.value = UserDefaultsRepository.alertOverrideStartDND.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideStartDND.value = value
+        }
+        <<< SwitchRow("alertOverrideStartRepeat"){ row in
+        row.title = "Repeat Sound"
+        row.value = UserDefaultsRepository.alertOverrideStartRepeat.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideStartRepeat.value = value
+        }
+        
     }
     }
     
     
     func buildOverrideEnd(){
     func buildOverrideEnd(){
         form
         form
             +++ Section(header: "Override Ended Alert", footer: "Alert will trigger without repeat once when an override is turned off. There is no need to snooze this alert") { row in
             +++ Section(header: "Override Ended Alert", footer: "Alert will trigger without repeat once when an override is turned off. There is no need to snooze this alert") { row in
-                               row.hidden = "$overrideAlerts != 'Override End'"
-                           }
-        <<< SwitchRow("alertOverrideEnd"){ row in
-                    row.title = "Active"
-                    row.value = UserDefaultsRepository.alertOverrideEnd.value
-                    }.onChange { [weak self] row in
-                            guard let value = row.value else { return }
-                            UserDefaultsRepository.alertOverrideEnd.value = value
-                    }
-        
+                row.hidden = "$overrideAlerts != 'Override End'"
+            }
+            <<< SwitchRow("alertOverrideEnd"){ row in
+                row.title = "Active"
+                row.value = UserDefaultsRepository.alertOverrideEnd.value
+            }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideEnd.value = value
+            }
+            
             <<< PickerInputRow<String>("alertOverrideEndSound") { row in
             <<< PickerInputRow<String>("alertOverrideEndSound") { row in
                 row.title = "Sound"
                 row.title = "Sound"
                 row.options = soundFiles
                 row.options = soundFiles
                 row.value = UserDefaultsRepository.alertOverrideEndSound.value
                 row.value = UserDefaultsRepository.alertOverrideEndSound.value
                 row.displayValueFor = { value in
                 row.displayValueFor = { value in
-                guard let value = value else { return nil }
+                    guard let value = value else { return nil }
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                     return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
                 }
                 }
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.alertOverrideEndSound.value = value
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideEndSound.value = value
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.stop()
                 AlarmSound.stop()
                 AlarmSound.playTest()
                 AlarmSound.playTest()
-            }
-       
+        }
+        <<< SwitchRow("alertOverrideEndDND"){ row in
+        row.title = "Override System Volume"
+        row.value = UserDefaultsRepository.alertOverrideEndDND.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideEndDND.value = value
+        }
+        <<< SwitchRow("alertOverrideEndRepeat"){ row in
+        row.title = "Repeat Sound"
+        row.value = UserDefaultsRepository.alertOverrideEndRepeat.value
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.alertOverrideEndRepeat.value = value
+        }
+        
     }
     }
 
 
+    func buildAlarmSettings() {
+           form
+            +++ Section(header: "Alarm Sound Settings", footer: "Use this volume level for alarms that override system volume")
+           
+            <<< StepperRow("forcedOutputVolume") { row in
+                  row.title = "Volume Level"
+                row.cell.stepper.stepValue = 0.05
+                  row.cell.stepper.minimumValue = 0
+                  row.cell.stepper.maximumValue = 1
+                  row.value = Double(UserDefaultsRepository.forcedOutputVolume.value)
+                    row.displayValueFor = { value in
+                    guard let value = value else { return nil }
+                    return "\(Int(value*100))%"
+                    }
+              }.onChange { [weak self] row in
+                      guard let value = row.value else { return }
+                      UserDefaultsRepository.forcedOutputVolume.value = Float(value)
+              }
+           /* <<< StepperRow("fadeInTimeInterval") { row in
+                row.title = "Fade-in Seconds"
+                row.cell.stepper.stepValue = 5
+                row.cell.stepper.minimumValue = 0
+                row.cell.stepper.maximumValue = 60
+                row.value = Double(UserDefaultsRepository.fadeInTimeInterval.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.fadeInTimeInterval.value = TimeInterval(value)
+            }*/
+       }
 
 
 }
 }
 
 

+ 1 - 1
LoopFollow/ViewControllers/SettingsViewController.swift

@@ -70,7 +70,7 @@ class SettingsViewController: FormViewController {
         
         
         
         
         buildGeneralSettings()
         buildGeneralSettings()
-        buildAlarmSettings()
+       // buildAlarmSettings()
         buildGraphSettings()
         buildGraphSettings()
         buildWatchSettings()
         buildWatchSettings()
         buildDebugSettings()
         buildDebugSettings()

+ 28 - 0
LoopFollow/repository/UserDefaults.swift

@@ -92,6 +92,8 @@ class UserDefaultsRepository {
     static let alertUrgentLowSnooze = UserDefaultsValue<Int>(key: "alertUrgentLowSnooze", default: 5)
     static let alertUrgentLowSnooze = UserDefaultsValue<Int>(key: "alertUrgentLowSnooze", default: 5)
     static let alertUrgentLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentLowSnoozedTime", default: nil)
     static let alertUrgentLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentLowSnoozedTime", default: nil)
     static let alertUrgentLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentLowIsSnoozed", default: false)
     static let alertUrgentLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentLowIsSnoozed", default: false)
+    static let alertUrgentLowDND = UserDefaultsValue<Bool>(key: "alertUrgentLowDND", default: true)
+    static let alertUrgentLowRepeat = UserDefaultsValue<Bool>(key: "alertUrgentLowRepeat", default: true)
     static let alertUrgentLowSound = UserDefaultsValue<String>(key: "alertUrgentLowSound", default: "Indeed")
     static let alertUrgentLowSound = UserDefaultsValue<String>(key: "alertUrgentLowSound", default: "Indeed")
     
     
     static let alertLowActive = UserDefaultsValue<Bool>(key: "alertLowActive", default: false)
     static let alertLowActive = UserDefaultsValue<Bool>(key: "alertLowActive", default: false)
@@ -99,6 +101,8 @@ class UserDefaultsRepository {
     static let alertLowSnooze = UserDefaultsValue<Int>(key: "alertLowSnooze", default: 5)
     static let alertLowSnooze = UserDefaultsValue<Int>(key: "alertLowSnooze", default: 5)
     static let alertLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertLowSnoozedTime", default: nil)
     static let alertLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertLowSnoozedTime", default: nil)
     static let alertLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertLowIsSnoozed", default: false)
     static let alertLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertLowIsSnoozed", default: false)
+    static let alertLowDND = UserDefaultsValue<Bool>(key: "alertLowDND", default: true)
+    static let alertLowRepeat = UserDefaultsValue<Bool>(key: "alertLowRepeat", default: true)
     static let alertLowSound = UserDefaultsValue<String>(key: "alertLowSound", default: "Indeed")
     static let alertLowSound = UserDefaultsValue<String>(key: "alertLowSound", default: "Indeed")
     
     
     static let alertHighActive = UserDefaultsValue<Bool>(key: "alertHighActive", default: false)
     static let alertHighActive = UserDefaultsValue<Bool>(key: "alertHighActive", default: false)
@@ -107,6 +111,8 @@ class UserDefaultsRepository {
     static let alertHighSnooze = UserDefaultsValue<Int>(key: "alertHighSnooze", default: 60)
     static let alertHighSnooze = UserDefaultsValue<Int>(key: "alertHighSnooze", default: 60)
     static let alertHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertHighSnoozedTime", default: nil)
     static let alertHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertHighSnoozedTime", default: nil)
     static let alertHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertHighIsSnoozed", default: false)
     static let alertHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertHighIsSnoozed", default: false)
+    static let alertHighDND = UserDefaultsValue<Bool>(key: "alertHighDND", default: true)
+    static let alertHighRepeat = UserDefaultsValue<Bool>(key: "alertHighRepeat", default: true)
     static let alertHighSound = UserDefaultsValue<String>(key: "alertHighSound", default: "Indeed")
     static let alertHighSound = UserDefaultsValue<String>(key: "alertHighSound", default: "Indeed")
     
     
     static let alertUrgentHighActive = UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false)
     static let alertUrgentHighActive = UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false)
@@ -114,6 +120,8 @@ class UserDefaultsRepository {
     static let alertUrgentHighSnooze = UserDefaultsValue<Int>(key: "alertUrgentHighSnooze", default: 30)
     static let alertUrgentHighSnooze = UserDefaultsValue<Int>(key: "alertUrgentHighSnooze", default: 30)
     static let alertUrgentHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentHighSnoozedTime", default: nil)
     static let alertUrgentHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentHighSnoozedTime", default: nil)
     static let alertUrgentHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentHighIsSnoozed", default: false)
     static let alertUrgentHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentHighIsSnoozed", default: false)
+    static let alertUrgentHighDND = UserDefaultsValue<Bool>(key: "alertUrgentHighDND", default: true)
+    static let alertUrgentHighRepeat = UserDefaultsValue<Bool>(key: "alertUrgentHighRepeat", default: true)
     static let alertUrgentHighSound = UserDefaultsValue<String>(key: "alertUrgentHighSound", default: "Indeed")
     static let alertUrgentHighSound = UserDefaultsValue<String>(key: "alertUrgentHighSound", default: "Indeed")
 
 
     
     
@@ -125,6 +133,8 @@ class UserDefaultsRepository {
     static let alertFastDropBelowBG = UserDefaultsValue<Float>(key: "alertFastDropBelowBG", default: 120.0)
     static let alertFastDropBelowBG = UserDefaultsValue<Float>(key: "alertFastDropBelowBG", default: 120.0)
     static let alertFastDropSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastDropSnoozedTime", default: nil)
     static let alertFastDropSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastDropSnoozedTime", default: nil)
     static let alertFastDropIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastDropIsSnoozed", default: false)
     static let alertFastDropIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastDropIsSnoozed", default: false)
+    static let alertFastDropDND = UserDefaultsValue<Bool>(key: "alertFastDropDND", default: true)
+    static let alertFastDropRepeat = UserDefaultsValue<Bool>(key: "alertFastDropRepeat", default: true)
     static let alertFastDropSound = UserDefaultsValue<String>(key: "alertFastDropSound", default: "Indeed")
     static let alertFastDropSound = UserDefaultsValue<String>(key: "alertFastDropSound", default: "Indeed")
     
     
     static let alertFastRiseActive = UserDefaultsValue<Bool>(key: "alertFastRiseDeltaActive", default: false)
     static let alertFastRiseActive = UserDefaultsValue<Bool>(key: "alertFastRiseDeltaActive", default: false)
@@ -135,6 +145,8 @@ class UserDefaultsRepository {
     static let alertFastRiseAboveBG = UserDefaultsValue<Float>(key: "alertFastRiseAboveBG", default: 200.0)
     static let alertFastRiseAboveBG = UserDefaultsValue<Float>(key: "alertFastRiseAboveBG", default: 200.0)
     static let alertFastRiseSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastRiseSnoozedTime", default: nil)
     static let alertFastRiseSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastRiseSnoozedTime", default: nil)
     static let alertFastRiseIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastRiseIsSnoozed", default: false)
     static let alertFastRiseIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastRiseIsSnoozed", default: false)
+    static let alertFastRiseDND = UserDefaultsValue<Bool>(key: "alertFastRiseDND", default: true)
+    static let alertFastRiseRepeat = UserDefaultsValue<Bool>(key: "alertFastRiseRepeat", default: true)
     static let alertFastRiseSound = UserDefaultsValue<String>(key: "alertFastRiseSound", default: "Indeed")
     static let alertFastRiseSound = UserDefaultsValue<String>(key: "alertFastRiseSound", default: "Indeed")
     
     
     
     
@@ -143,6 +155,8 @@ class UserDefaultsRepository {
     static let alertMissedReadingSnooze = UserDefaultsValue<Int>(key: "alertMissedReadingSnooze", default: 30)
     static let alertMissedReadingSnooze = UserDefaultsValue<Int>(key: "alertMissedReadingSnooze", default: 30)
     static let alertMissedReadingSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedReadingSnoozedTime", default: nil)
     static let alertMissedReadingSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedReadingSnoozedTime", default: nil)
     static let alertMissedReadingIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedReadingIsSnoozed", default: false)
     static let alertMissedReadingIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedReadingIsSnoozed", default: false)
+    static let alertMissedReadingDND = UserDefaultsValue<Bool>(key: "alertMissedReadingDND", default: true)
+    static let alertMissedReadingRepeat = UserDefaultsValue<Bool>(key: "alertMissedReadingRepeat", default: true)
     static let alertMissedReadingSound = UserDefaultsValue<String>(key: "alertMissedReadingSound", default: "Indeed")
     static let alertMissedReadingSound = UserDefaultsValue<String>(key: "alertMissedReadingSound", default: "Indeed")
     
     
     
     
@@ -154,6 +168,8 @@ class UserDefaultsRepository {
     static let alertNotLoopingUpperLimit = UserDefaultsValue<Float>(key: "alertNotLoopingAboveBG", default: 160.0)
     static let alertNotLoopingUpperLimit = UserDefaultsValue<Float>(key: "alertNotLoopingAboveBG", default: 160.0)
     static let alertNotLoopingSnoozedTime = UserDefaultsValue<Date?>(key: "alertNotLoopingSnoozedTime", default: nil)
     static let alertNotLoopingSnoozedTime = UserDefaultsValue<Date?>(key: "alertNotLoopingSnoozedTime", default: nil)
     static let alertNotLoopingIsSnoozed = UserDefaultsValue<Bool>(key: "alertNotLoopingIsSnoozed", default: false)
     static let alertNotLoopingIsSnoozed = UserDefaultsValue<Bool>(key: "alertNotLoopingIsSnoozed", default: false)
+    static let alertNotLoopingDND = UserDefaultsValue<Bool>(key: "alertNotLoopingDND", default: true)
+    static let alertNotLoopingRepeat = UserDefaultsValue<Bool>(key: "alertNotLoopingRepeat", default: true)
     static let alertNotLoopingSound = UserDefaultsValue<String>(key: "alertNotLoopingSound", default: "Indeed")
     static let alertNotLoopingSound = UserDefaultsValue<String>(key: "alertNotLoopingSound", default: "Indeed")
     static let alertLastLoopTime = UserDefaultsValue<TimeInterval>(key: "alertLastLoopTime", default: 0)
     static let alertLastLoopTime = UserDefaultsValue<TimeInterval>(key: "alertLastLoopTime", default: 0)
     
     
@@ -166,10 +182,14 @@ class UserDefaultsRepository {
     static let alertMissedBolusLowGramsBG = UserDefaultsValue<Float>(key: "alertMissedBolusLowGramsBG", default: 70.0)
     static let alertMissedBolusLowGramsBG = UserDefaultsValue<Float>(key: "alertMissedBolusLowGramsBG", default: 70.0)
     static let alertMissedBolusSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedBolusSnoozedTime", default: nil)
     static let alertMissedBolusSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedBolusSnoozedTime", default: nil)
     static let alertMissedBolusIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedBolusIsSnoozed", default: false)
     static let alertMissedBolusIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedBolusIsSnoozed", default: false)
+    static let alertMissedBolusDND = UserDefaultsValue<Bool>(key: "alertMissedBolusDND", default: false)
+    static let alertMissedBolusRepeat = UserDefaultsValue<Bool>(key: "alertMissedBolusRepeat", default: false)
     static let alertMissedBolusSound = UserDefaultsValue<String>(key: "alertMissedBolusSound", default: "Indeed")
     static let alertMissedBolusSound = UserDefaultsValue<String>(key: "alertMissedBolusSound", default: "Indeed")
     
     
     static let alertSAGEActive = UserDefaultsValue<Bool>(key: "alertSAGEActive", default: false)
     static let alertSAGEActive = UserDefaultsValue<Bool>(key: "alertSAGEActive", default: false)
     static let alertSAGE = UserDefaultsValue<Int>(key: "alertSAGE", default: 8) //Hours
     static let alertSAGE = UserDefaultsValue<Int>(key: "alertSAGE", default: 8) //Hours
+    static let alertSAGEDND = UserDefaultsValue<Bool>(key: "alertSAGEDND", default: false)
+    static let alertSAGERepeat = UserDefaultsValue<Bool>(key: "alertSAGERepeat", default: false)
     static let alertSAGESnooze = UserDefaultsValue<Int>(key: "alertSAGESnooze", default: 2) //Hours
     static let alertSAGESnooze = UserDefaultsValue<Int>(key: "alertSAGESnooze", default: 2) //Hours
     static let alertSAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertSAGESnoozedTime", default: nil)
     static let alertSAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertSAGESnoozedTime", default: nil)
     static let alertSAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertSAGEIsSnoozed", default: false)
     static let alertSAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertSAGEIsSnoozed", default: false)
@@ -177,6 +197,8 @@ class UserDefaultsRepository {
     
     
     static let alertCAGEActive = UserDefaultsValue<Bool>(key: "alertCAGEActive", default: false)
     static let alertCAGEActive = UserDefaultsValue<Bool>(key: "alertCAGEActive", default: false)
     static let alertCAGE = UserDefaultsValue<Int>(key: "alertCAGE", default: 4) //Hours
     static let alertCAGE = UserDefaultsValue<Int>(key: "alertCAGE", default: 4) //Hours
+    static let alertCAGEDND = UserDefaultsValue<Bool>(key: "alertCAGEDND", default: false)
+    static let alertCAGERepeat = UserDefaultsValue<Bool>(key: "alertCAGERepeat", default: false)
     static let alertCAGESnooze = UserDefaultsValue<Int>(key: "alertCAGESnooze", default: 2) //Hours
     static let alertCAGESnooze = UserDefaultsValue<Int>(key: "alertCAGESnooze", default: 2) //Hours
     static let alertCAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertCAGESnoozedTime", default: nil)
     static let alertCAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertCAGESnoozedTime", default: nil)
     static let alertCAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertCAGEIsSnoozed", default: false)
     static let alertCAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertCAGEIsSnoozed", default: false)
@@ -187,12 +209,18 @@ class UserDefaultsRepository {
     static let alertTemporaryActive = UserDefaultsValue<Bool>(key: "alertTemporaryActive", default: false)
     static let alertTemporaryActive = UserDefaultsValue<Bool>(key: "alertTemporaryActive", default: false)
     static let alertTemporaryBelow = UserDefaultsValue<Bool>(key: "alertTemporaryBelow", default: true)
     static let alertTemporaryBelow = UserDefaultsValue<Bool>(key: "alertTemporaryBelow", default: true)
     static let alertTemporaryBG = UserDefaultsValue<Float>(key: "alertTemporaryBG", default: 90.0)
     static let alertTemporaryBG = UserDefaultsValue<Float>(key: "alertTemporaryBG", default: 90.0)
+    static let alertTemporaryBGDND = UserDefaultsValue<Bool>(key: "alertTemporaryBGDND", default: true)
+    static let alertTemporaryBGRepeat = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeat", default: true)
     static let alertTemporarySound = UserDefaultsValue<String>(key: "alertTemporarySound", default: "Indeed")
     static let alertTemporarySound = UserDefaultsValue<String>(key: "alertTemporarySound", default: "Indeed")
     
     
     static let alertOverrideStart = UserDefaultsValue<Bool>(key: "alertOverrideStart", default: false)
     static let alertOverrideStart = UserDefaultsValue<Bool>(key: "alertOverrideStart", default: false)
+    static let alertOverrideStartDND = UserDefaultsValue<Bool>(key: "alertOverrideStartDND", default: false)
+    static let alertOverrideStartRepeat = UserDefaultsValue<Bool>(key: "alertOverrideStartRepeat", default: false)
     static let alertOverrideStartSound = UserDefaultsValue<String>(key: "alertOverrideStartSound", default: "Alert_Tone_Busy")
     static let alertOverrideStartSound = UserDefaultsValue<String>(key: "alertOverrideStartSound", default: "Alert_Tone_Busy")
     
     
     static let alertOverrideEnd = UserDefaultsValue<Bool>(key: "alertOverrideEnd", default: false)
     static let alertOverrideEnd = UserDefaultsValue<Bool>(key: "alertOverrideEnd", default: false)
+    static let alertOverrideEndDND = UserDefaultsValue<Bool>(key: "alertOverrideEndDND", default: false)
+    static let alertOverrideEndRepeat = UserDefaultsValue<Bool>(key: "alertOverrideEndRepeat", default: false)
     static let alertOverrideEndSound = UserDefaultsValue<String>(key: "alertOverrideEndSound", default: "Ending_Reached")
     static let alertOverrideEndSound = UserDefaultsValue<String>(key: "alertOverrideEndSound", default: "Ending_Reached")
     
     
 }
 }