Przeglądaj źródła

cage sage improvements

Jonas Björkert 2 lat temu
rodzic
commit
fe70281520

+ 4 - 0
LoopFollow.xcodeproj/project.pbxproj

@@ -33,6 +33,7 @@
 		DDCF979A24C14DB4002C9752 /* WatchSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */; };
 		DDCF979C24C14EFB002C9752 /* AdvancedSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979B24C14EFB002C9752 /* AdvancedSettingsViewController.swift */; };
 		DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979D24C2382A002C9752 /* AppStateController.swift */; };
+		DDF9676E2AD08C6E00C5EB95 /* SiteChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDF9676D2AD08C6E00C5EB95 /* SiteChange.swift */; };
 		FC16A97A24996673003D6245 /* NightScout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97924996673003D6245 /* NightScout.swift */; };
 		FC16A97B249966A3003D6245 /* AlarmSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */; };
 		FC16A97D24996747003D6245 /* Alarms.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97C24996747003D6245 /* Alarms.swift */; };
@@ -216,6 +217,7 @@
 		DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979B24C14EFB002C9752 /* AdvancedSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979D24C2382A002C9752 /* AppStateController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateController.swift; sourceTree = "<group>"; };
+		DDF9676D2AD08C6E00C5EB95 /* SiteChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteChange.swift; sourceTree = "<group>"; };
 		ECA3EFB4037410B4973BB632 /* Pods-LoopFollow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LoopFollow.debug.xcconfig"; path = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig"; sourceTree = "<group>"; };
 		FC16A97924996673003D6245 /* NightScout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightScout.swift; sourceTree = "<group>"; };
 		FC16A97C24996747003D6245 /* Alarms.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alarms.swift; sourceTree = "<group>"; };
@@ -420,6 +422,7 @@
 				DD493ADC2ACF21E0009A6922 /* Basals.swift */,
 				DD493ADA2ACF21A3009A6922 /* Bolus.swift */,
 				DD493AD42ACF2109009A6922 /* ResumePump.swift */,
+				DDF9676D2AD08C6E00C5EB95 /* SiteChange.swift */,
 			);
 			path = Treatments;
 			sourceTree = "<group>";
@@ -954,6 +957,7 @@
 				DD493ADF2ACF22BB009A6922 /* SAge.swift in Sources */,
 				DD493ADB2ACF21A3009A6922 /* Bolus.swift in Sources */,
 				DD152D3B24C01B2300361FA2 /* InfoDisplaySettingsViewController.swift in Sources */,
+				DDF9676E2AD08C6E00C5EB95 /* SiteChange.swift in Sources */,
 				DDCF979C24C14EFB002C9752 /* AdvancedSettingsViewController.swift in Sources */,
 				FC97881C2485969B00A7906C /* MainViewController.swift in Sources */,
 				FC1BB3A8252CA4C5003839C2 /* UIImageExtension.swift in Sources */,

+ 8 - 1
LoopFollow/Controllers/Nightscout/CAge.swift

@@ -12,7 +12,14 @@ import Foundation
 extension MainViewController {
     // NS Cage Web Call
     func webLoadNSCage() {
-        let parameters: [String: String] = ["find[eventType]": NightscoutUtils.EventType.cage.rawValue, "count": "1"]
+        let currentTimeString = dateTimeUtils.getCurrentDateTimeString()
+        
+        let parameters: [String: String] = [
+            "find[eventType]": NightscoutUtils.EventType.cage.rawValue,
+            "find[created_at][$lte]": currentTimeString,
+            "count": "1"
+        ]
+        
         NightscoutUtils.executeRequest(eventType: .cage, parameters: parameters) { (result: Result<[cageData], Error>) in
             switch result {
             case .success(let data):

+ 0 - 2
LoopFollow/Controllers/Nightscout/DeviceStatus.swift

@@ -6,8 +6,6 @@
 //  Copyright © 2023 Jon Fawcett. All rights reserved.
 //
 
-//TODO:
-
 import Foundation
 import UIKit
 

+ 2 - 0
LoopFollow/Controllers/Nightscout/SAge.swift

@@ -13,10 +13,12 @@ extension MainViewController {
     // NS Sage Web Call
     func webLoadNSSage() {
         let lastDateString = dateTimeUtils.nowMinus10DaysTimeInterval()
+        let currentTimeString = dateTimeUtils.getCurrentDateTimeString()
         
         let parameters: [String: String] = [
             "find[eventType]": NightscoutUtils.EventType.sage.rawValue,
             "find[created_at][$gte]": lastDateString,
+            "find[created_at][$lte]": currentTimeString,
             "count": "1"
         ]
         

+ 13 - 8
LoopFollow/Controllers/Nightscout/Treatments.swift

@@ -16,9 +16,11 @@ extension MainViewController {
         
         let graphHours = 24 * UserDefaultsRepository.downloadDays.value
         let startTimeString = dateTimeUtils.nowMinusNHoursTimeInterval(N: graphHours)
-        
-        let parameters: [String: String] = ["find[created_at][$gte]": startTimeString]
-        
+        let currentTimeString = dateTimeUtils.getCurrentDateTimeString()
+        let parameters: [String: String] = [
+            "find[created_at][$gte]": startTimeString,
+            "find[created_at][$lte]": currentTimeString
+        ]
         NightscoutUtils.executeDynamicRequest(eventType: .treatments, parameters: parameters) { (result: Result<Any, Error>) in
             switch result {
             case .success(let data):
@@ -46,7 +48,7 @@ extension MainViewController {
         var bgCheck: [[String:AnyObject]] = []
         var suspendPump: [[String:AnyObject]] = []
         var resumePump: [[String:AnyObject]] = []
-        var pumpSiteChange: [[String:AnyObject]] = []
+        var pumpSiteChange: [cageData] = []
         var cgmSensorStart: [sageData] = []
         
         for i in 0..<entries.count {
@@ -78,8 +80,11 @@ extension MainViewController {
                 suspendPump.append(entry!)
             case "Resume Pump":
                 resumePump.append(entry!)
-            case "Pump Site Change":
-                pumpSiteChange.append(entry!)
+            case "Pump Site Change", "Site Change":
+                if let createdAt = entry?["created_at"] as? String {
+                    let newEntry = cageData(created_at: createdAt)
+                    pumpSiteChange.append(newEntry)
+                }
             case "Sensor Start":
                 if let createdAt = entry?["created_at"] as? String {
                     let newEntry = sageData(created_at: createdAt)
@@ -89,7 +94,6 @@ extension MainViewController {
                 print("No Match: \(String(describing: entry))")
             }
         }
-        // end of for loop
         
         if tempBasal.count > 0 {
             processNSBasals(entries: tempBasal)
@@ -141,7 +145,7 @@ extension MainViewController {
                 clearOldResume()
             }
         }
-        
+        processSage(entries: cgmSensorStart)
         if cgmSensorStart.count > 0 {
             processSensorStart(entries: cgmSensorStart)
         } else {
@@ -156,5 +160,6 @@ extension MainViewController {
                 clearOldNotes()
             }
         }
+        processCage(entries: pumpSiteChange)
     }
 }

+ 9 - 0
LoopFollow/Controllers/Nightscout/Treatments/SensorStart.swift

@@ -8,6 +8,15 @@
 
 import Foundation
 extension MainViewController {
+    func processSage(entries: [sageData]) {
+        if !entries.isEmpty {
+            updateSage(data: entries)
+        } else if mayDoDeepSageCheck {
+            webLoadNSSage()
+        }
+        mayDoDeepSageCheck = false
+    }
+    
     // NS Sensor Start Response Processor
     func processSensorStart(entries: [sageData]) {
         sensorStartGraphData.removeAll()

+ 19 - 0
LoopFollow/Controllers/Nightscout/Treatments/SiteChange.swift

@@ -0,0 +1,19 @@
+//
+//  SiteChange.swift
+//  LoopFollow
+//
+//  Created by Jonas Björkert on 2023-10-06.
+//  Copyright © 2023 Jon Fawcett. All rights reserved.
+//
+
+import Foundation
+extension MainViewController {
+    func processCage(entries: [cageData]) {
+        if !entries.isEmpty {
+            updateCage(data: entries)
+        } else if mayDoDeepCageCheck {
+            webLoadNSCage()
+        }
+        mayDoDeepCageCheck = false
+    }
+}

+ 0 - 28
LoopFollow/Controllers/Timers.swift

@@ -17,7 +17,6 @@ extension MainViewController {
         if !profileTimer.isValid { startProfileTimer(time: 3) }
         if !deviceStatusTimer.isValid { startDeviceStatusTimer(time: 4) }
         if !treatmentsTimer.isValid { startTreatmentsTimer(time: 5) }
-        if !cageSageTimer.isValid { startCageSageTimer(time: 6) }
         if !minAgoTimer.isValid { startMinAgoTimer(time: minAgoTimeInterval) }
         if !calendarTimer.isValid { startCalendarTimer(time: 15) }
         if !alarmTimer.isValid { startAlarmTimer(time: 30) }
@@ -28,7 +27,6 @@ extension MainViewController {
         profileTimer.invalidate()
         deviceStatusTimer.invalidate()
         treatmentsTimer.invalidate()
-        cageSageTimer.invalidate()
         minAgoTimer.invalidate()
         calendarTimer.invalidate()
         alarmTimer.invalidate()
@@ -226,33 +224,7 @@ extension MainViewController {
             startProfileTimer()
         }
     }
-    
-    // Cage and Sage Timer
-    // Runs on 10 minute intervals
-    // Pauses with stale BG data
-    func startCageSageTimer(time: TimeInterval =  60 * 10) {
-        cageSageTimer = Timer.scheduledTimer(timeInterval: time,
-                                               target: self,
-                                               selector: #selector(MainViewController.cageSageTimerDidEnd(_:)),
-                                               userInfo: nil,
-                                               repeats: false)
-    }
-    
-    @objc func cageSageTimerDidEnd(_ timer:Timer) {
         
-        // reset timer to 1 minute if settings aren't entered
-        if UserDefaultsRepository.url.value == "" || !UserDefaultsRepository.loopUser.value {
-            startCageSageTimer(time: 60)
-            return
-        }
-        
-        if UserDefaultsRepository.url.value != "" {
-            webLoadNSCage()
-            webLoadNSSage()
-            startCageSageTimer()
-        }
-    }
-    
     // Cancel and reset the playing alarm if it has not been snoozed after 4 min 50 seconds.
     // This allows the next BG reading to either start the timer going or not fire if the situation has been resolved
     func startAlarmPlayingTimer(time: TimeInterval = 290) {

+ 5 - 2
LoopFollow/ViewControllers/MainViewController.swift

@@ -70,7 +70,9 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     let consoleLogging = true
     var timeofLastBGUpdate = 0 as TimeInterval
     var nsVerifiedAlerted = false
-    
+    var mayDoDeepSageCheck = true
+    var mayDoDeepCageCheck = true
+
     var backgroundTask = BackgroundTask()
     
     // Refresh NS Data
@@ -91,7 +93,6 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     var calTimer = Timer()
     
     var bgTimer = Timer()
-    var cageSageTimer = Timer()
     var profileTimer = Timer()
     var deviceStatusTimer = Timer()
     var treatmentsTimer = Timer()
@@ -265,6 +266,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         MinAgoText.text = "Refreshing"
         invalidateTimers()
         restartAllTimers()
+        mayDoDeepSageCheck = true
+        mayDoDeepCageCheck = true
         refreshControl.endRefreshing()
     }
     

+ 14 - 0
LoopFollow/helpers/DateTime.swift

@@ -57,6 +57,20 @@ class dateTimeUtils {
         return utcTime
     }
     
+    static func getCurrentDateTimeString() -> String {
+        let currentTimeInterval = getNowTimeIntervalUTC()
+        
+        let dateFormatter = DateFormatter()
+        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
+        dateFormatter.locale = Locale(identifier: "en_US")
+        dateFormatter.timeZone = TimeZone.init(secondsFromGMT: 0)
+        
+        let currentDate = Date(timeIntervalSince1970: currentTimeInterval)
+        let currentTimeString = dateFormatter.string(from: currentDate)
+        
+        return currentTimeString
+    }
+    
     static func nowMinusNHoursTimeInterval(N: Int) -> String {
         let today = Date()
         let nHoursAgo = Calendar.current.date(byAdding: .hour, value: -N, to: today)!

+ 1 - 1
LoopFollow/helpers/NightscoutUtils.swift

@@ -111,7 +111,7 @@ class NightscoutUtils {
         task.resume()
     }
     
-    //@available(*, deprecated, message: "Use constructURL instead.")
+    @available(*, deprecated, message: "Use constructURL instead.")
     static func createURLRequest(url: String, token: String?, path: String) -> URLRequest? {
         var requestURLString = "\(url)\(path)"