فهرست منبع

Merge pull request #307 from loopandlearn/topbg

Reset topbg for each cycle
Marion Barker 2 سال پیش
والد
کامیت
02a7167994

+ 14 - 10
LoopFollow/Controllers/Graphs.swift

@@ -630,6 +630,8 @@ extension MainViewController {
         let maxBGOffset: Float = 50
         
         var colors = [NSUIColor]()
+
+        topBG = UserDefaultsRepository.minBGScale.value
         for i in 0..<entries.count{
             if Float(entries[i].sgv) > topBG - maxBGOffset {
                 topBG = Float(entries[i].sgv) + maxBGOffset
@@ -670,12 +672,12 @@ extension MainViewController {
         
         if UserDefaultsRepository.debugLog.value { writeDebugLog(value: "Total Colors: " + mainChart.colors.count.description) }
         
-        BGChart.rightAxis.axisMaximum = Double(topBG)
+        BGChart.rightAxis.axisMaximum = Double(calculateMaxBgGraphValue())
         BGChart.setVisibleXRangeMinimum(600)
         BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
         BGChart.data?.notifyDataChanged()
         BGChart.notifyDataSetChanged()
-        BGChartFull.rightAxis.axisMaximum = Double(topBG)
+        BGChartFull.rightAxis.axisMaximum = Double(calculateMaxBgGraphValue())
         BGChartFull.data?.dataSets[dataIndex].notifyDataSetChanged()
         BGChartFull.data?.notifyDataChanged()
         BGChartFull.notifyDataSetChanged()
@@ -707,10 +709,12 @@ extension MainViewController {
         
         var colors = [NSUIColor]()
         let maxBGOffset: Float = 20
+
+        topPredictionBG = UserDefaultsRepository.minBGScale.value
         for i in 0..<predictionData.count {
             var predictionVal = Double(predictionData[i].sgv)
-            if Float(predictionVal) > topBG - maxBGOffset {
-                topBG = Float(predictionVal) + maxBGOffset
+            if Float(predictionVal) > topPredictionBG - maxBGOffset {
+                topPredictionBG = Float(predictionVal) + maxBGOffset
             }
             
             if i == 0 {
@@ -744,7 +748,7 @@ extension MainViewController {
                 smallChart.circleColors.append(colors[i])
             }
         }
-        BGChart.rightAxis.axisMaximum = Double(topBG)
+        BGChart.rightAxis.axisMaximum = Double(calculateMaxBgGraphValue())
         BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
         BGChart.data?.notifyDataChanged()
         BGChart.notifyDataSetChanged()
@@ -1454,8 +1458,8 @@ extension MainViewController {
     
     func updateOverrideGraph() {
         var dataIndex = 6
-        var yTop: Double = Double(topBG - 5)
-        var yBottom: Double = Double(topBG - 25)
+        var yTop: Double = Double(calculateMaxBgGraphValue() - 5)
+        var yBottom: Double = Double(calculateMaxBgGraphValue() - 25)
         var chart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
         var smallChart = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
         chart.clear()
@@ -1549,8 +1553,8 @@ extension MainViewController {
         
         for i in 0..<predictionData.count {
             let predictionVal = Double(predictionData[i].sgv)
-            if Float(predictionVal) > topBG - maxBGOffset {
-                topBG = Float(predictionVal) + maxBGOffset
+            if Float(predictionVal) > topPredictionBG - maxBGOffset {
+                topPredictionBG = Float(predictionVal) + maxBGOffset
             }
             
             if i == 0 {
@@ -1589,7 +1593,7 @@ extension MainViewController {
             }
         }
         
-        BGChart.rightAxis.axisMaximum = Double(topBG)
+        BGChart.rightAxis.axisMaximum = Double(calculateMaxBgGraphValue())
         BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
         BGChart.data?.notifyDataChanged()
         BGChart.notifyDataSetChanged()

+ 1 - 1
LoopFollow/Controllers/Nightscout/DeviceStatusOpenAPS.swift

@@ -44,7 +44,7 @@ extension MainViewController {
                 
                 var predictioncolor = UIColor.systemGray
                 PredictionLabel.textColor = predictioncolor
-                
+                topPredictionBG = UserDefaultsRepository.minBGScale.value
                 if let enactdata = lastLoopRecord["enacted"] as? [String:AnyObject],
                    let predbgdata = enactdata["predBGs"] as? [String: AnyObject] {
                     let predictionTypes: [(type: String, colorName: String, dataIndex: Int)] = [

+ 1 - 1
LoopFollow/Controllers/Nightscout/Treatments/Carbs.swift

@@ -36,7 +36,7 @@ extension MainViewController {
             lastFoundIndex = sgv.foundIndex
             
             var offset = -50
-            if sgv.sgv < Double(topBG - 100) {
+            if sgv.sgv < Double(calculateMaxBgGraphValue() - 100) {
                 let bolusTime = findNearestBolusbyTime(timeWithin: 300, needle: dateTimeStamp, haystack: bolusData, startingIndex: lastFoundBolus)
                 lastFoundBolus = bolusTime.foundIndex
                 

+ 117 - 110
LoopFollow/ViewControllers/MainViewController.swift

@@ -132,7 +132,10 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     var latestIOB = ""
     var lastOverrideStartTime: TimeInterval = 0
     var lastOverrideEndTime: TimeInterval = 0
+    
     var topBG: Float = UserDefaultsRepository.minBGScale.value
+    var topPredictionBG: Float = UserDefaultsRepository.minBGScale.value
+
     var lastOverrideAlarm: TimeInterval = 0
     
     // share
@@ -195,7 +198,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         
         smallGraphHeightConstraint.constant = CGFloat(UserDefaultsRepository.smallGraphHeight.value)
         self.view.layoutIfNeeded()
-      
+
         // TODO: need non-us server ?
         let shareUserName = UserDefaultsRepository.shareUserName.value
         let sharePassword = UserDefaultsRepository.sharePassword.value
@@ -228,9 +231,9 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         
         // Trigger foreground and background functions
         let notificationCenter = NotificationCenter.default
-            notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
-            notificationCenter.addObserver(self, selector: #selector(appCameToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
-         
+        notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
+        notificationCenter.addObserver(self, selector: #selector(appCameToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
+
         // Setup the Graph
         if firstGraphLoad {
             createGraph()
@@ -406,8 +409,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
                 self.derivedTableData.append(self.tableData[UserDefaultsRepository.infoSort.value[i]])
             }
         }
-   }
-   
+    }
+    
     // Info Table Functions
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         //return tableData.count
@@ -438,7 +441,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         }
         
     }
-
+    
     @objc func appCameToForeground() {
         // reset screenlock state if needed
         UIApplication.shared.isIdleTimerDisabled = UserDefaultsRepository.screenlockSwitchState.value;
@@ -476,7 +479,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             }
         }
     }
-
+    
     func versionAlert(title: String = "Update Available", message: String) {
         DispatchQueue.main.async {
             let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
@@ -484,7 +487,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             self.present(alert, animated: true)
         }
     }
-
+    
     func checkAppExpirationStatus() {
         let now = Date()
         let expirationDate = BuildDetails.default.calculateExpirationDate()
@@ -498,7 +501,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             }
         }
     }
-
+    
     func expirationAlert() {
         DispatchQueue.main.async {
             let alert = UIAlertController(title: "App Expiration Warning", message: "This app will expire in less than a week. Please rebuild to continue using it.", preferredStyle: .alert)
@@ -506,7 +509,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             self.present(alert, animated: true)
         }
     }
-
+    
     @objc override func viewDidAppear(_ animated: Bool) {
         showHideNSDetails()
     }
@@ -515,14 +518,14 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     func clearLastInfoData(index: Int){
         tableData[index].value = ""
     }
-
+    
     func stringFromTimeInterval(interval: TimeInterval) -> String {
         let interval = Int(interval)
         let minutes = (interval / 60) % 60
         let hours = (interval / 3600)
         return String(format: "%02d:%02d", hours, minutes)
     }
-
+    
     func showHideNSDetails() {
         var isHidden = false
         var isEnabled = true
@@ -563,7 +566,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     }
     
     
-
+    
     func setBGTextColor() {
         if bgData.count > 0 {
             guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
@@ -588,10 +591,10 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     {
         if value == nil { return "-" }
         let //graphics:[String:String]=["Flat":"\u{2192}","DoubleUp":"\u{21C8}","SingleUp":"\u{2191}","FortyFiveUp":"\u{2197}\u{FE0E}","FortyFiveDown":"\u{2198}\u{FE0E}","SingleDown":"\u{2193}","DoubleDown":"\u{21CA}","None":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-"]
-        graphics:[String:String]=["Flat":"→","DoubleUp":"↑↑","SingleUp":"↑","FortyFiveUp":"↗","FortyFiveDown":"↘︎","SingleDown":"↓","DoubleDown":"↓↓","None":"-","NONE":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-", "": "-"]
+    graphics:[String:String]=["Flat":"→","DoubleUp":"↑↑","SingleUp":"↑","FortyFiveUp":"↗","FortyFiveDown":"↘︎","SingleDown":"↓","DoubleDown":"↓↓","None":"-","NONE":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-", "": "-"]
         return graphics[value]!
     }
-        
+    
     func writeCalendar() {
         if UserDefaultsRepository.debugLog.value {
             self.writeDebugLog(value: "Write calendar start")
@@ -610,111 +613,111 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         if UserDefaultsRepository.calendarIdentifier.value == "" { return }
         
         if self.bgData.count < 1 { return }
-            
+        
         // This lets us fire the method to write Min Ago entries only once a minute starting after 6 minutes but allows new readings through
         if self.lastCalDate == self.bgData[self.bgData.count - 1].date
             && (self.calTimer.isValid || (dateTimeUtils.getNowTimeIntervalUTC() - self.lastCalDate) < 360) {
             return
         }
-
-            // Create Event info
+        
+        // Create Event info
         var deltaBG = 0 // protect index out of bounds
         if self.bgData.count > 1 {
             deltaBG = self.bgData[self.bgData.count - 1].sgv -  self.bgData[self.bgData.count - 2].sgv as Int
         }
-            let deltaTime = (TimeInterval(Date().timeIntervalSince1970) - self.bgData[self.bgData.count - 1].date) / 60
-            var deltaString = ""
-            if deltaBG < 0 {
-                deltaString = bgUnits.toDisplayUnits(String(deltaBG))
-            }
-            else
-            {
-                deltaString = "+" + bgUnits.toDisplayUnits(String(deltaBG))
-            }
-            let direction = self.bgDirectionGraphic(self.bgData[self.bgData.count - 1].direction ?? "")
-            
-            var eventStartDate = Date(timeIntervalSince1970: self.bgData[self.bgData.count - 1].date)
-//                if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar start date") }
-            var eventEndDate = eventStartDate.addingTimeInterval(60 * 10)
-            var  eventTitle = UserDefaultsRepository.watchLine1.value
-            if (UserDefaultsRepository.watchLine2.value.count > 1) {
-                eventTitle += "\n" + UserDefaultsRepository.watchLine2.value
-            }
-            eventTitle = eventTitle.replacingOccurrences(of: "%BG%", with: bgUnits.toDisplayUnits(String(self.bgData[self.bgData.count - 1].sgv)))
-            eventTitle = eventTitle.replacingOccurrences(of: "%DIRECTION%", with: direction)
-            eventTitle = eventTitle.replacingOccurrences(of: "%DELTA%", with: deltaString)
-            if self.currentOverride != 1.0 {
-                let val = Int( self.currentOverride*100)
-                // let overrideText = String(format:"%f1", self.currentOverride*100)
-                let text = String(val) + "%"
-                eventTitle = eventTitle.replacingOccurrences(of: "%OVERRIDE%", with: text)
-            } else {
-                eventTitle = eventTitle.replacingOccurrences(of: "%OVERRIDE%", with: "")
-            }
-            eventTitle = eventTitle.replacingOccurrences(of: "%LOOP%", with: self.latestLoopStatusString)
-            var minAgo = ""
-            if deltaTime > 9 {
-                // write old BG reading and continue pushing out end date to show last entry
-                minAgo = String(Int(deltaTime)) + " min"
-                eventEndDate = eventStartDate.addingTimeInterval((60 * 10) + (deltaTime * 60))
-            }
-            var cob = "0"
-            if self.latestCOB != "" {
-                cob = self.latestCOB
-            }
-            var basal = "~"
-            if self.latestBasal != "" {
-                basal = self.latestBasal
-            }
-            var iob = "0"
-            if self.latestIOB != "" {
-                iob = self.latestIOB
-            }
-            eventTitle = eventTitle.replacingOccurrences(of: "%MINAGO%", with: minAgo)
-            eventTitle = eventTitle.replacingOccurrences(of: "%IOB%", with: iob)
-            eventTitle = eventTitle.replacingOccurrences(of: "%COB%", with: cob)
-            eventTitle = eventTitle.replacingOccurrences(of: "%BASAL%", with: basal)
-            
-            
-            
-            // Delete Events from last 2 hours and 2 hours in future
-            var deleteStartDate = Date().addingTimeInterval(-60*60*2)
-            var deleteEndDate = Date().addingTimeInterval(60*60*2)
-            // guard solves for some ios upgrades removing the calendar
-            guard let deleteCalendar = self.store.calendar(withIdentifier: UserDefaultsRepository.calendarIdentifier.value) as? EKCalendar else { return }
-            var predicate2 = self.store.predicateForEvents(withStart: deleteStartDate, end: deleteEndDate, calendars: [deleteCalendar])
-            var eVDelete = self.store.events(matching: predicate2) as [EKEvent]?
-            if eVDelete != nil {
-                for i in eVDelete! {
-                    do {
-                        try self.store.remove(i, span: EKSpan.thisEvent, commit: true)
-                        //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Delete") }
-                    } catch let error {
-                        //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Error - Calendar Delete") }
-                        print(error)
-                    }
+        let deltaTime = (TimeInterval(Date().timeIntervalSince1970) - self.bgData[self.bgData.count - 1].date) / 60
+        var deltaString = ""
+        if deltaBG < 0 {
+            deltaString = bgUnits.toDisplayUnits(String(deltaBG))
+        }
+        else
+        {
+            deltaString = "+" + bgUnits.toDisplayUnits(String(deltaBG))
+        }
+        let direction = self.bgDirectionGraphic(self.bgData[self.bgData.count - 1].direction ?? "")
+        
+        var eventStartDate = Date(timeIntervalSince1970: self.bgData[self.bgData.count - 1].date)
+        //                if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar start date") }
+        var eventEndDate = eventStartDate.addingTimeInterval(60 * 10)
+        var  eventTitle = UserDefaultsRepository.watchLine1.value
+        if (UserDefaultsRepository.watchLine2.value.count > 1) {
+            eventTitle += "\n" + UserDefaultsRepository.watchLine2.value
+        }
+        eventTitle = eventTitle.replacingOccurrences(of: "%BG%", with: bgUnits.toDisplayUnits(String(self.bgData[self.bgData.count - 1].sgv)))
+        eventTitle = eventTitle.replacingOccurrences(of: "%DIRECTION%", with: direction)
+        eventTitle = eventTitle.replacingOccurrences(of: "%DELTA%", with: deltaString)
+        if self.currentOverride != 1.0 {
+            let val = Int( self.currentOverride*100)
+            // let overrideText = String(format:"%f1", self.currentOverride*100)
+            let text = String(val) + "%"
+            eventTitle = eventTitle.replacingOccurrences(of: "%OVERRIDE%", with: text)
+        } else {
+            eventTitle = eventTitle.replacingOccurrences(of: "%OVERRIDE%", with: "")
+        }
+        eventTitle = eventTitle.replacingOccurrences(of: "%LOOP%", with: self.latestLoopStatusString)
+        var minAgo = ""
+        if deltaTime > 9 {
+            // write old BG reading and continue pushing out end date to show last entry
+            minAgo = String(Int(deltaTime)) + " min"
+            eventEndDate = eventStartDate.addingTimeInterval((60 * 10) + (deltaTime * 60))
+        }
+        var cob = "0"
+        if self.latestCOB != "" {
+            cob = self.latestCOB
+        }
+        var basal = "~"
+        if self.latestBasal != "" {
+            basal = self.latestBasal
+        }
+        var iob = "0"
+        if self.latestIOB != "" {
+            iob = self.latestIOB
+        }
+        eventTitle = eventTitle.replacingOccurrences(of: "%MINAGO%", with: minAgo)
+        eventTitle = eventTitle.replacingOccurrences(of: "%IOB%", with: iob)
+        eventTitle = eventTitle.replacingOccurrences(of: "%COB%", with: cob)
+        eventTitle = eventTitle.replacingOccurrences(of: "%BASAL%", with: basal)
+        
+        
+        
+        // Delete Events from last 2 hours and 2 hours in future
+        var deleteStartDate = Date().addingTimeInterval(-60*60*2)
+        var deleteEndDate = Date().addingTimeInterval(60*60*2)
+        // guard solves for some ios upgrades removing the calendar
+        guard let deleteCalendar = self.store.calendar(withIdentifier: UserDefaultsRepository.calendarIdentifier.value) as? EKCalendar else { return }
+        var predicate2 = self.store.predicateForEvents(withStart: deleteStartDate, end: deleteEndDate, calendars: [deleteCalendar])
+        var eVDelete = self.store.events(matching: predicate2) as [EKEvent]?
+        if eVDelete != nil {
+            for i in eVDelete! {
+                do {
+                    try self.store.remove(i, span: EKSpan.thisEvent, commit: true)
+                    //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Delete") }
+                } catch let error {
+                    //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Error - Calendar Delete") }
+                    print(error)
                 }
             }
+        }
+        
+        // Write New Event
+        var event = EKEvent(eventStore: self.store)
+        event.title = eventTitle
+        event.startDate = eventStartDate
+        event.endDate = eventEndDate
+        event.calendar = self.store.calendar(withIdentifier: UserDefaultsRepository.calendarIdentifier.value)
+        do {
+            try self.store.save(event, span: .thisEvent, commit: true)
+            self.calTimer.invalidate()
+            self.startCalTimer(time: (60 * 1))
             
-            // Write New Event
-            var event = EKEvent(eventStore: self.store)
-            event.title = eventTitle
-            event.startDate = eventStartDate
-            event.endDate = eventEndDate
-            event.calendar = self.store.calendar(withIdentifier: UserDefaultsRepository.calendarIdentifier.value)
-            do {
-                try self.store.save(event, span: .thisEvent, commit: true)
-                self.calTimer.invalidate()
-                self.startCalTimer(time: (60 * 1))
-                
-                self.lastCalDate = self.bgData[self.bgData.count - 1].date
-                //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Write: " + eventTitle) }
-                //UserDefaultsRepository.savedEventID.value = event.eventIdentifier //save event id to access this particular event later
-            } catch {
-                print("*** Error storing to the calendar")
-                // Display error to user
-                //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Error: Calendar Write") }
-            }
+            self.lastCalDate = self.bgData[self.bgData.count - 1].date
+            //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Write: " + eventTitle) }
+            //UserDefaultsRepository.savedEventID.value = event.eventIdentifier //save event id to access this particular event later
+        } catch {
+            print("*** Error storing to the calendar")
+            // Display error to user
+            //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Error: Calendar Write") }
+        }
     }
     
     
@@ -733,7 +736,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             guard let debug = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
             if debug.debugTextView.text.lengthOfBytes(using: .utf8) > 20000 {
                 debug.debugTextView.text = ""
-                    }
+            }
             debug.debugTextView.text += logText
         }
         
@@ -775,4 +778,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             autoScrollPauseUntil = Date().addingTimeInterval(5 * 60) // User is viewing historical data, pause auto-scrolling
         }
     }
+
+    func calculateMaxBgGraphValue() -> Float {
+        return max(topBG, topPredictionBG)
+    }
 }