Jon Fawcett 6 лет назад
Родитель
Сommit
6f858ae6a8

+ 49 - 0
LoopFollow/Controllers/Alarms.swift

@@ -170,6 +170,55 @@ extension MainViewController {
                        return
                }
            }
+        
+        // check for missed bolus - Only checks within 1 hour of carb entry
+        if UserDefaultsRepository.alertMissedBolusActive.value {
+            if carbData.count > 0  {
+                let lastCarb = carbData[carbData.count - 1].value
+                let lastCarbTime = carbData[carbData.count - 1].date
+                let now = dateTimeUtils.getNowTimeIntervalUTC()
+                
+                if lastCarbTime > (now - (60 * 60)) {
+                    // If low grams is active, the carbs and BG must both be higher
+                    if (UserDefaultsRepository.alertMissedBolusLowGramsActive.value &&
+                        lastCarb >= Double(UserDefaultsRepository.alertMissedBolusLowGrams.value) &&
+                        currentBG >= UserDefaultsRepository.alertMissedBolusLowGramsBG.value) ||
+                        !UserDefaultsRepository.alertMissedBolusLowGramsActive.value {
+                        
+                        // There is a current carb but no boluses at all
+                        if bolusData.count < 1 && ((now - lastCarbTime) < (60 * 60)) {
+                            AlarmSound.whichAlarm = "Missed Bolus Alert"
+                            triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil)
+                            return
+                        } else {
+                            
+                            // Get the latest bolus over the small bolus exclusion
+                            var lastBolus = 0.0
+                            var lastBolusTime = 0.0
+                            var i = 1
+                            while lastBolus < UserDefaultsRepository.alertMissedBolusIgnoreBolus.value {
+                                lastBolus = bolusData[bolusData.count - i].value
+                                lastBolusTime = bolusData[bolusData.count - i].date
+                                i += 1
+                            }
+                            
+                            // Calclulate the prebolus by moving the carbs back in time the allowed amount.
+                            // This lets us only need to check that the recent bolus is after it.
+                            if (lastCarbTime - Double(UserDefaultsRepository.alertMissedBolusPrebolus.value * 60)) > lastBolusTime  {
+                                AlarmSound.whichAlarm = "Missed Bolus Alert"
+                               triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil)
+                               return
+                            }
+                            
+                        }
+                    }
+                }
+                
+                
+                
+                
+            }
+        }
            
            //check for missed reading alert
            if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) {

+ 28 - 2
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -165,7 +165,7 @@ class AlarmViewController: FormViewController {
         buildFastRiseAlert()
         buildMissedReadings()
         buildNotLooping()
- //       buildMissedBolus()
+        buildMissedBolus()
         buildAppInactive()
         buildSage()
         buildCage()
@@ -1204,7 +1204,7 @@ class AlarmViewController: FormViewController {
     
     func buildMissedBolus(){
         form
-            +++ Section(header: "Missed Bolus", footer: "Alert after X minutes when carbs are entered with no Bolus. Optional: Ignore low treatment carbs under a certain BG")
+            +++ Section(header: "Missed Bolus", footer: "Alert after X minutes when carbs are entered with no Bolus. Options to Ignore low treatment carbs under a certain BG, ignore small boluses, and consider boluses within a certain amount of time before the carbs as a prebolus.")
         <<< SwitchRow("alertMissedBolusActive"){ row in
                 row.title = "Active"
                 row.value = UserDefaultsRepository.alertMissedBolusActive.value
@@ -1227,6 +1227,32 @@ class AlarmViewController: FormViewController {
                 guard let value = row.value else { return }
                 UserDefaultsRepository.alertMissedBolus.value = Int(value)
         }
+            <<< StepperRow("alertMissedBolusPrebolus") { row in
+                row.title = "Prebolus Max Time"
+                row.cell.stepper.stepValue = 5
+                row.cell.stepper.minimumValue = 1
+                row.cell.stepper.maximumValue = 45
+                row.value = Double(UserDefaultsRepository.alertMissedBolusPrebolus.value)
+                row.hidden = "$alertMissedBolusActive == false"
+                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.alertMissedBolusPrebolus.value = Int(value)
+            }
+            <<< StepperRow("alertMissedBolusIgnoreBolus") { row in
+                row.title = "Ignore Bolus <="
+                row.cell.stepper.stepValue = 0.05
+                row.cell.stepper.minimumValue = 0.05
+                row.cell.stepper.maximumValue = 2
+                row.value = Double(UserDefaultsRepository.alertMissedBolusIgnoreBolus.value)
+                row.hidden = "$alertMissedBolusActive == false"
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMissedBolusIgnoreBolus.value = value
+            }
         <<< SwitchRow("alertMissedBolusLowGramsActive"){ row in
         row.title = "Ignore Low Treatments"
             row.hidden = "$alertMissedBolusActive == false"

+ 1 - 1
LoopFollow/ViewControllers/MainViewController.swift

@@ -70,7 +70,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     var firstGraphLoad: Bool = true
     var firstBasalGraphLoad: Bool = true
     var minAgoBG: Double = 0.0
-    var currentOverride = 0.0
+    var currentOverride = 1.0
     
     // Vars for NS Pull
     var graphHours:Int=24

+ 1 - 0
LoopFollow/repository/UserDefaults.swift

@@ -141,6 +141,7 @@ class UserDefaultsRepository {
     static let alertMissedBolus = UserDefaultsValue<Int>(key: "alertMissedBolus", default: 10)
     static let alertMissedBolusSnooze = UserDefaultsValue<Int>(key: "alertMissedBolusSnooze", default: 10)
     static let alertMissedBolusPrebolus = UserDefaultsValue<Int>(key: "alertMissedBolusPrebolus", default: 20)
+    static let alertMissedBolusIgnoreBolus = UserDefaultsValue<Double>(key: "alertMissedBolusIgnoreBolus", default: 0.5)
     static let alertMissedBolusLowGramsActive = UserDefaultsValue<Bool>(key: "alertMissedBolusLowGramsActive", default: false)
     static let alertMissedBolusLowGrams = UserDefaultsValue<Int>(key: "alertMissedBolusLowGrams", default: 10)
     static let alertMissedBolusLowGramsBG = UserDefaultsValue<Int>(key: "alertMissedBolusLowGramsBG", default: 70)