Преглед изворни кода

- fix delta updating to 0 when missed readings
- fix adding the same reading twice after missed readings
- started NS bolus pull. not running in code yet
- made nightscout tab work for popups, reports, profile
- added low/high line settings not tied to alert
- fixed setting the Is Snoozed switches

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

+ 33 - 18
LoopFollow/Controllers/MainViewController.swift

@@ -194,6 +194,7 @@ class MainViewController: UIViewController, UITableViewDataSource {
             loadBGData(urlUser: urlUser, onlyPullLastRecord: onlyPullLastRecord)
             clearLastInfoData()
             loadDeviceStatus(urlUser: urlUser)
+           // loadBoluses(urlUser: urlUser)
            // loadTempBasals(urlUser: urlUser)
         } else {
             updateMinAgo()
@@ -204,22 +205,27 @@ class MainViewController: UIViewController, UITableViewDataSource {
     }
     
     // Post process new NS Data and feed all updates
-    func ProcessNSData(data: [sgvData], onlyPullLastRecord: Bool){
+    func ProcessNSBGData(data: [sgvData], onlyPullLastRecord: Bool){
         if !onlyPullLastRecord {
             bgData.removeAll()
+        } else if bgData[bgData.count - 1].date != data[0].date {
+            bgData.removeFirst()
+        } else {
+            self.updateBadge(entries: bgData)
+            self.updateBG(entries: bgData)
+            self.createGraph(entries: bgData)
+            return
         }
-            for i in 0..<data.count{
-               var dateString = data[data.count - 1 - i].date / 1000
-                dateString.round(FloatingPointRoundingRule.toNearestOrEven)
-                let reading = sgvData(sgv: data[data.count - 1 - i].sgv, date: dateString, direction: data[data.count - 1 - i].direction)
-            bgData.append(reading)
-           }
-            
 
-                 self.updateBadge(entries: bgData)
-                  self.updateBG(entries: bgData)
-                  self.createGraph(entries: bgData)
-                  
+        for i in 0..<data.count{
+            var dateString = data[data.count - 1 - i].date / 1000
+            dateString.round(FloatingPointRoundingRule.toNearestOrEven)
+            let reading = sgvData(sgv: data[data.count - 1 - i].sgv, date: dateString, direction: data[data.count - 1 - i].direction)
+            bgData.append(reading)
+        }
+        self.updateBadge(entries: bgData)
+        self.updateBG(entries: bgData)
+        self.createGraph(entries: bgData)
        }
     
     
@@ -264,7 +270,7 @@ class MainViewController: UIViewController, UITableViewDataSource {
             let entriesResponse = try? decoder.decode([sgvData].self, from: data)
             if let entriesResponse = entriesResponse {
                 DispatchQueue.main.async {
-                    self.ProcessNSData(data: entriesResponse, onlyPullLastRecord: onlyPullLastRecord)
+                    self.ProcessNSBGData(data: entriesResponse, onlyPullLastRecord: onlyPullLastRecord)
                 }
             }
             else
@@ -380,8 +386,16 @@ class MainViewController: UIViewController, UITableViewDataSource {
     }
     
     func loadBoluses(urlUser: String){
+        var calendar = Calendar.current
+        let today = Date()
+        let midnight = calendar.startOfDay(for: today)
+        let yesterday = calendar.date(byAdding: .day, value: -1, to: today)!
+        let dateFormatter = DateFormatter()
+        dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
+        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
+        let formattedDate = dateFormatter.string(from: yesterday)
         
-        var searchString = "find[eventType]=Meal%20Bolus&find[created_at][$gte]=2020-06-08T00:00:00"
+        var searchString = "find[eventType]=Meal%20Bolus&find[created_at][$gte]=" + formattedDate
         var urlBGDataPath: String = urlUser + "/api/v1/treatments.json?"
         if token == "" {
             urlBGDataPath = urlBGDataPath + searchString
@@ -570,13 +584,13 @@ class MainViewController: UIViewController, UITableViewDataSource {
         
         //Add lower red line based on low alert value
         let ll = ChartLimitLine()
-        ll.limit = Double(UserDefaultsRepository.alertLowBG.value)
+        ll.limit = Double(UserDefaultsRepository.lowLine.value)
         ll.lineColor = NSUIColor.red
         BGChart.rightAxis.addLimitLine(ll)
         
         //Add upper yellow line based on low alert value
         let ul = ChartLimitLine()
-        ul.limit = Double(UserDefaultsRepository.alertHighBG.value)
+        ul.limit = Double(UserDefaultsRepository.highLine.value)
         ul.lineColor = NSUIColor.yellow
         BGChart.rightAxis.addLimitLine(ul)
         
@@ -694,7 +708,8 @@ class MainViewController: UIViewController, UITableViewDataSource {
     }
     
     func bgDirectionGraphic(_ value:String)->String {
-        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":"-"]
+        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":"-","NOT COMPUTABLE":"-","RATE OUT OF RANGE":"-"]
         
         
         return graphics[value]!
@@ -795,7 +810,7 @@ class MainViewController: UIViewController, UITableViewDataSource {
             // Check Fast Rise
             if UserDefaultsRepository.alertFastRiseActive.value && !UserDefaultsRepository.alertFastRiseIsSnoozed.value {
                 // make sure limit is off or BG is above value
-                if (!UserDefaultsRepository.alertFastRiseUseLimit.value) || (UserDefaultsRepository.alertFastRiseUseLimit.value && currentBG < UserDefaultsRepository.alertFastRiseAboveBG.value) {
+                if (!UserDefaultsRepository.alertFastRiseUseLimit.value) || (UserDefaultsRepository.alertFastRiseUseLimit.value && currentBG > UserDefaultsRepository.alertFastRiseAboveBG.value) {
                     let compare = UserDefaultsRepository.alertFastDropDelta.value
                     
                     //check last 2/3/4 readings

+ 56 - 2
LoopFollow/Controllers/NightScoutViewController.swift

@@ -11,7 +11,7 @@ import WebKit
 
 
 
-class NightscoutViewController: UIViewController, WKUIDelegate {
+class NightscoutViewController: UIViewController {
 
     @IBOutlet weak var webView: WKWebView!
     
@@ -19,6 +19,11 @@ class NightscoutViewController: UIViewController, WKUIDelegate {
     override func viewDidLoad() {
         super.viewDidLoad()
         guard let myUrl = URL(string: UserDefaultsRepository.url.value) else { return  }
+        
+
+        webView.configuration.preferences.javaScriptEnabled = true
+        webView.navigationDelegate = self
+        webView.uiDelegate = self
         webView.load(URLRequest(url: myUrl))
         
         let refreshControl = UIRefreshControl()
@@ -42,6 +47,55 @@ class NightscoutViewController: UIViewController, WKUIDelegate {
         // for _blank target or non-mainFrame target
         webView.load(navigationAction.request)
         return nil    }
-
 }
 
+// MARK:- WKUIDelegate implementation
+extension NightscoutViewController: WKNavigationDelegate, WKUIDelegate {
+    
+    func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
+        
+        let alertCtrl = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
+        
+        alertCtrl.addAction(UIAlertAction(title: "OK", style: .default) { action in
+            completionHandler(true)
+        })
+
+        alertCtrl.addAction(UIAlertAction(title: "Cancel", style: .cancel) { action in
+            completionHandler(false)
+        })
+        
+        present(alertCtrl, animated: true)
+    }
+    
+    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        
+        guard let _ = navigationAction.request.url else {
+            decisionHandler(.cancel)
+            return
+        }
+     
+        decisionHandler(.allow)
+    }
+    
+    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
+        
+        guard let url = request.url else {
+            return false
+        }
+        
+        NSLog("Should start: \(url.absoluteString)")
+        return true
+    }
+    
+    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
+        
+        if navigationAction.targetFrame == nil {
+            webView.load(navigationAction.request)
+        }
+        
+        return nil
+    }
+    
+
+ 
+}

+ 28 - 0
LoopFollow/Controllers/SettingsViewController.swift

@@ -70,7 +70,35 @@ class SettingsViewController: FormViewController {
                         guard let value = row.value else { return }
                         UserDefaultsRepository.showLines.value = value
                         
+            }
+            <<< StepperRow("lowLine") { row in
+                row.title = "Low Line Value"
+                row.cell.stepper.stepValue = 1
+                row.cell.stepper.minimumValue = 150
+                row.cell.stepper.maximumValue = 400
+                row.value = Double(UserDefaultsRepository.lowLine.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.lowLine.value = Int(value)
+            }
+            <<< StepperRow("highLine") { row in
+                row.title = "High Line Value"
+                row.cell.stepper.stepValue = 1
+                row.cell.stepper.minimumValue = 150
+                row.cell.stepper.maximumValue = 400
+                row.value = Double(UserDefaultsRepository.highLine.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.highLine.value = Int(value)
+            }
         
          }
         

+ 7 - 7
LoopFollow/Controllers/SnoozeViewController.swift

@@ -59,43 +59,43 @@ class SnoozeViewController: UIViewController {
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertTemporaryActive", value: false)
         } else if AlarmSound.whichAlarm == "Urgent Low Alert" {
-            UserDefaultsRepository.alertUrgentLowIsSnoozed.value = false
+            UserDefaultsRepository.alertUrgentLowIsSnoozed.value = true
             UserDefaultsRepository.alertUrgentLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentLowSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertUrgentLowIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertUrgentLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentLowSnooze.value * 60)))
         } else if AlarmSound.whichAlarm == "Low Alert" {
-            UserDefaultsRepository.alertLowIsSnoozed.value = false
+            UserDefaultsRepository.alertLowIsSnoozed.value = true
             UserDefaultsRepository.alertLowSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertLowSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertLowIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertLowSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertLowSnooze.value * 60)))
         } else if AlarmSound.whichAlarm == "High Alert" {
-            UserDefaultsRepository.alertHighIsSnoozed.value = false
+            UserDefaultsRepository.alertHighIsSnoozed.value = true
             UserDefaultsRepository.alertHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertHighSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertHighIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertHighSnooze.value * 60)))
         } else if AlarmSound.whichAlarm == "Urgent High Alert" {
-            UserDefaultsRepository.alertUrgentHighIsSnoozed.value = false
+            UserDefaultsRepository.alertUrgentHighIsSnoozed.value = true
             UserDefaultsRepository.alertUrgentHighSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentHighSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertUrgentHighIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertUrgentHighSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertUrgentHighSnooze.value * 60)))
         } else if AlarmSound.whichAlarm == "Fast Drop Alert" {
-            UserDefaultsRepository.alertFastDropIsSnoozed.value = false
+            UserDefaultsRepository.alertFastDropIsSnoozed.value = true
             UserDefaultsRepository.alertFastDropSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastDropSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertFastDropIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertFastDropSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastDropSnooze.value * 60)))
         } else if AlarmSound.whichAlarm == "Fast Rise Alert" {
-            UserDefaultsRepository.alertFastRiseIsSnoozed.value = false
+            UserDefaultsRepository.alertFastRiseIsSnoozed.value = true
             UserDefaultsRepository.alertFastRiseSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastRiseSnooze.value * 60))
             guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
             alarms.reloadIsSnoozed(key: "alertFastRiseIsSnoozed", value: true)
             alarms.reloadSnoozeTime(key: "alertFastRiseSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertFastRiseSnooze.value * 60)))
         }  else if AlarmSound.whichAlarm == "Missed Reading Alert" {
-           UserDefaultsRepository.alertMissedReadingIsSnoozed.value = false
+           UserDefaultsRepository.alertMissedReadingIsSnoozed.value = true
            UserDefaultsRepository.alertMissedReadingSnoozedTime.value = Date().addingTimeInterval(TimeInterval(UserDefaultsRepository.alertMissedReadingSnooze.value * 60))
            guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
            alarms.reloadIsSnoozed(key: "alertMissedReadingIsSnoozed", value: true)

+ 2 - 0
LoopFollow/repository/UserDefaults.swift

@@ -18,6 +18,8 @@ class UserDefaultsRepository {
     static let showDots = UserDefaultsValue<Bool>(key: "showDots", default: true)
     static let showLines = UserDefaultsValue<Bool>(key: "showLines", default: true)
     static let hoursToLoad = UserDefaultsValue<Int>(key: "hoursToLoad", default: 24)
+    static let lowLine = UserDefaultsValue<Int>(key: "lowLine", default: 70)
+    static let highLine = UserDefaultsValue<Int>(key: "highLine", default: 180)
     
     // General Settings
     static let backgroundRefreshFrequency = UserDefaultsValue<Int>(key: "backgroundRefreshFrequency", default: 1)