Jon Fawcett пре 6 година
родитељ
комит
90b586e7df

+ 55 - 2
LoopFollow/Controllers/AlarmSound.swift

@@ -89,8 +89,6 @@ class AlarmSound {
             try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category(rawValue: convertFromAVAudioSessionCategory(AVAudioSession.Category.playback)))
             try AVAudioSession.sharedInstance().setActive(true)
             
-            // Play endless loops
-            //self.audioPlayer!.numberOfLoops = 1
             self.audioPlayer?.numberOfLoops = 0
             
             // init volume before start playing (mute if fade-in)
@@ -116,6 +114,61 @@ 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() {
         

+ 37 - 0
LoopFollow/Controllers/Alarms.swift

@@ -260,6 +260,43 @@ extension MainViewController {
            
        }
        
+    func checkOverrideAlarms()
+    {
+        // Make sure we have 2 values to compare
+        if overrideData.count < 2 { return }
+        
+        let latest = overrideData[overrideData.count - 1]
+        let prior = overrideData[overrideData.count - 2]
+        
+        // Make sure latest value is current within 10 minutes
+        if latest.date < dateTimeUtils.getNowTimeIntervalUTC() - 600 { return }
+        
+        // make sure values are with 10 minutes of each other
+        if ( latest.date - prior.date ) > 600 { return }
+        
+        // make sure values are not the same
+        if latest.value == prior.value { return }
+        
+        if UserDefaultsRepository.alertOverrideStart.value {
+            if latest.value != 1.0 {
+                AlarmSound.whichAlarm = String(format: "%.0f%%", latest.value) + " Override Started"
+                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideStartSound.value)
+            }
+        } else if UserDefaultsRepository.alertOverrideEnd.value {
+            if latest.value == 0.0 {
+                AlarmSound.whichAlarm = "Override Ended"
+                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value)
+            }
+        }
+    }
+    
+    func triggerOneTimeAlarm(sound: String)
+    {
+        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)
+        AlarmSound.setSoundFile(str: sound)
+        AlarmSound.playOnce()
+    }
     
     func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?)
     {

+ 1 - 0
LoopFollow/Controllers/NightScout.swift

@@ -478,6 +478,7 @@ extension MainViewController {
         }
         overrideData.reverse()
         updateOverrideGraph()
+        checkOverrideAlarms()
     }
     
     // NS Cage Web Call

+ 91 - 0
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -171,6 +171,9 @@ class AlarmViewController: FormViewController {
             let otherRow2 = self?.form.rowBy(tag: "otherAlerts") as! SegmentedRow<String>
             otherRow2.value = nil
             otherRow2.reload()
+            let otherRow3 = self?.form.rowBy(tag: "overrideAlerts") as! SegmentedRow<String>
+            otherRow3.value = nil
+            otherRow3.reload()
             row.value = value
         }
             <<< SegmentedRow<String>("bgExtraAlerts"){ row in
@@ -185,6 +188,9 @@ class AlarmViewController: FormViewController {
                let otherRow2 = self?.form.rowBy(tag: "otherAlerts") as! SegmentedRow<String>
                otherRow2.value = nil
                otherRow2.reload()
+            let otherRow3 = self?.form.rowBy(tag: "overrideAlerts") as! SegmentedRow<String>
+            otherRow3.value = nil
+            otherRow3.reload()
             row.value = value
         }
             <<< SegmentedRow<String>("otherAlerts"){ row in
@@ -199,6 +205,26 @@ class AlarmViewController: FormViewController {
            let otherRow2 = self?.form.rowBy(tag: "bgAlerts") as! SegmentedRow<String>
            otherRow2.value = nil
            otherRow2.reload()
+            let otherRow3 = self?.form.rowBy(tag: "overrideAlerts") as! SegmentedRow<String>
+            otherRow3.value = nil
+            otherRow3.reload()
+            row.value = value
+        }
+        <<< SegmentedRow<String>("overrideAlerts"){ row in
+                row.title = ""
+                row.options = ["Override Start", "Override End"]
+                //row.value = "Not Looping"
+        }.onChange { [weak self] row in
+             guard let value = row.value else { return }
+            let otherRow = self?.form.rowBy(tag: "bgExtraAlerts") as! SegmentedRow<String>
+           otherRow.value = nil
+           otherRow.reload()
+           let otherRow2 = self?.form.rowBy(tag: "bgAlerts") as! SegmentedRow<String>
+           otherRow2.value = nil
+           otherRow2.reload()
+            let otherRow3 = self?.form.rowBy(tag: "otherAlerts") as! SegmentedRow<String>
+            otherRow3.value = nil
+            otherRow3.reload()
             row.value = value
         }
         
@@ -224,6 +250,9 @@ class AlarmViewController: FormViewController {
         
         buildTemporaryAlert()
         
+        buildOverrideStart()
+        buildOverrideEnd()
+        
         buildSnoozeAll()
         buildAppInactive()
         
@@ -1599,6 +1628,68 @@ class AlarmViewController: FormViewController {
                        }
                }
     }
+    
+    func buildOverrideStart(){
+        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
+                               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
+                row.title = "Sound"
+                row.options = soundFiles
+                row.value = UserDefaultsRepository.alertOverrideStartSound.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.alertOverrideStartSound.value = value
+                AlarmSound.setSoundFile(str: value)
+                AlarmSound.stop()
+                AlarmSound.playTest()
+            }
+       
+    }
+    
+    func buildOverrideEnd(){
+        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
+                               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
+                row.title = "Sound"
+                row.options = soundFiles
+                row.value = UserDefaultsRepository.alertOverrideEndSound.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.alertOverrideEndSound.value = value
+                AlarmSound.setSoundFile(str: value)
+                AlarmSound.stop()
+                AlarmSound.playTest()
+            }
+       
+    }
 
 
 }

+ 2 - 2
LoopFollow/helpers/Chart.swift

@@ -155,8 +155,8 @@ class PillMarker: MarkerImage {
 
     override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
         if entry.data != nil {
-            var multipler = entry.data as! Double * 100.0
-            labelText = String(format: "%.0f%%", multipler)
+            var multiplier = entry.data as! Double * 100.0
+            labelText = String(format: "%.0f%%", multiplier)
             //labelText = entry.data as? String ?? ""
         } else {
             labelText = String(entry.y)

+ 7 - 0
LoopFollow/repository/UserDefaults.swift

@@ -188,4 +188,11 @@ class UserDefaultsRepository {
     static let alertTemporaryBelow = UserDefaultsValue<Bool>(key: "alertTemporaryBelow", default: true)
     static let alertTemporaryBG = UserDefaultsValue<Float>(key: "alertTemporaryBG", default: 90.0)
     static let alertTemporarySound = UserDefaultsValue<String>(key: "alertTemporarySound", default: "Indeed")
+    
+    static let alertOverrideStart = UserDefaultsValue<Bool>(key: "alertOverrideStart", default: false)
+    static let alertOverrideStartSound = UserDefaultsValue<String>(key: "alertOverrideStartSound", default: "Alert_Tone_Busy")
+    
+    static let alertOverrideEnd = UserDefaultsValue<Bool>(key: "alertOverrideEnd", default: false)
+    static let alertOverrideEndSound = UserDefaultsValue<String>(key: "alertOverrideEndSound", default: "Ending_Reached")
+    
 }