Parcourir la source

Download 5 devicestatus in order for Trio to have better chance of getting an enacted record

Jonas Björkert il y a 1 an
Parent
commit
4aa0029bd9

+ 9 - 7
LoopFollow/Controllers/Nightscout/DeviceStatus.swift

@@ -13,7 +13,10 @@ import Charts
 extension MainViewController {
     // NS Device Status Web Call
     func webLoadNSDeviceStatus() {
-        let parameters: [String: String] = ["count": "1"]
+        let count = ObservableUserDefaults.shared.device.value == "Trio" ? "5" : "1"
+        LogManager.shared.log(category: .deviceStatus, message: "Fetching \(count) device status records", isDebug: true)
+
+        let parameters: [String: String] = ["count": count]
         NightscoutUtils.executeDynamicRequest(eventType: .deviceStatus, parameters: parameters) { result in
             switch result {
             case .success(let json):
@@ -24,15 +27,14 @@ extension MainViewController {
                 } else {
                     self.handleDeviceStatusError()
                 }
-                
             case .failure:
                 self.handleDeviceStatusError()
             }
         }
     }
-    
+
     private func handleDeviceStatusError() {
-        LogManager.shared.log(category: .alarm, message: "Device status fetch failed!")
+        LogManager.shared.log(category: .deviceStatus, message: "Device status fetch failed!")
         DispatchQueue.main.async {
             TaskScheduler.shared.rescheduleTask(id: .deviceStatus, to: Date().addingTimeInterval(10))
         }
@@ -80,6 +82,7 @@ extension MainViewController {
         infoManager.clearInfoData(types: [.iob, .cob, .override, .battery, .pump, .target, .isf, .carbRatio, .updated, .recBolus, .tdd])
 
         if jsonDeviceStatus.count == 0 {
+            LogManager.shared.log(category: .deviceStatus, message: "Device status is empty")
             return
         }
         
@@ -141,7 +144,7 @@ extension MainViewController {
 
         // OpenAPS - handle new data
         if let lastLoopRecord = lastDeviceStatus?["openaps"] as! [String : AnyObject]? {
-            DeviceStatusOpenAPS(formatter: formatter, lastDeviceStatus: lastDeviceStatus, lastLoopRecord: lastLoopRecord)
+            DeviceStatusOpenAPS(formatter: formatter, lastDeviceStatus: lastDeviceStatus, lastLoopRecord: lastLoopRecord, jsonDeviceStatus: jsonDeviceStatus)
         }
 
         // Start the timer based on the timestamp
@@ -180,7 +183,6 @@ extension MainViewController {
                 )
             }
         }
-        LogManager.shared.log(category: .alarm, message: "updateDeviceStatusDisplay done", isDebug: true)
-
+        LogManager.shared.log(category: .deviceStatus, message: "Update Device Status done", isDebug: true)
     }
 }

+ 30 - 3
LoopFollow/Controllers/Nightscout/DeviceStatusOpenAPS.swift

@@ -8,7 +8,7 @@ import UIKit
 import HealthKit
 
 extension MainViewController {
-    func DeviceStatusOpenAPS(formatter: ISO8601DateFormatter, lastDeviceStatus: [String: AnyObject]?, lastLoopRecord: [String: AnyObject]) {
+    func DeviceStatusOpenAPS(formatter: ISO8601DateFormatter, lastDeviceStatus: [String: AnyObject]?, lastLoopRecord: [String: AnyObject], jsonDeviceStatus: [[String:AnyObject]]) {
         if let createdAtString = lastDeviceStatus?["created_at"] as? String,
            let lastLoopTime = formatter.date(from: createdAtString)?.timeIntervalSince1970 {
             ObservableUserDefaults.shared.device.value = lastDeviceStatus?["device"] as? String ?? ""
@@ -33,11 +33,12 @@ extension MainViewController {
 
                 if wasEnacted {
                     UserDefaultsRepository.alertLastLoopTime.value = lastLoopTime
-                    LogManager.shared.log(category: .alarm, message: "New LastLoopTime: \(lastLoopTime)", isDebug: true)
+                    LogManager.shared.log(category: .deviceStatus, message: "New LastLoopTime: \(lastLoopTime)", isDebug: true)
 
                     evaluateNotLooping(lastLoopTime: UserDefaultsRepository.alertLastLoopTime.value)
                 } else {
-                    LogManager.shared.log(category: .alarm, message: "Last devicestatus was not enacted")
+                    LogManager.shared.log(category: .deviceStatus, message: "Last devicestatus was not enacted")
+                    findFallbackEnactedAndSetLoopTime(in: jsonDeviceStatus, formatter: formatter)
                 }
 
                 if let timestamp = enactedOrSuggested["timestamp"] as? String,
@@ -234,4 +235,30 @@ extension MainViewController {
             }
         }
     }
+
+    private func findFallbackEnactedAndSetLoopTime(
+        in allDeviceStatuses: [[String: AnyObject]],
+        formatter: ISO8601DateFormatter
+    ) {
+        for i in 1 ..< allDeviceStatuses.count {
+            let ds = allDeviceStatuses[i]
+            guard
+                let openaps = ds["openaps"] as? [String: AnyObject],
+                openaps["failureReason"] == nil,
+                let enacted = openaps["enacted"] as? [String: AnyObject],
+                let dateString = ds["created_at"] as? String,
+                let dateTime = formatter.date(from: dateString)?.timeIntervalSince1970
+            else {
+                continue
+            }
+
+            UserDefaultsRepository.alertLastLoopTime.value = dateTime
+            LogManager.shared.log(category: .deviceStatus, message: "Found older enacted. Setting lastLoopTime to \(dateTime)", isDebug: true)
+
+            evaluateNotLooping(lastLoopTime: dateTime)
+            return
+        }
+
+        LogManager.shared.log(category: .deviceStatus, message: "No older record was enacted!")
+    }
 }

+ 1 - 0
LoopFollow/Log/LogManager.swift

@@ -26,6 +26,7 @@ class LogManager {
         case dexcom = "Dexcom"
         case alarm = "Alarm"
         case calendar = "Calendar"
+        case deviceStatus = "Device Status"
     }
 
     init() {