Bladeren bron

Fetch suggested and enacted individually; upload always showing 'Waiting' or 'Not Enacted' WIP

Deniz Cengiz 1 jaar geleden
bovenliggende
commit
dc5bc79c87
2 gewijzigde bestanden met toevoegingen van 41 en 18 verwijderingen
  1. 26 14
      FreeAPS/Sources/Services/Network/NightscoutManager.swift
  2. 15 4
      Model/Helper/Determination+helper.swift

+ 26 - 14
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -335,21 +335,22 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
 
     func uploadStatus() async {
-        let fetchedDetermination = await determinationStorage.getOrefDeterminationNotYetUploadedToNightscout(
+        let fetchedEnactedDetermination = await determinationStorage.getOrefDeterminationNotYetUploadedToNightscout(
             await determinationStorage
-                .fetchLastDeterminationObjectID(predicate: NSPredicate.determinationsNotYetUploadedToNightscout)
+                .fetchLastDeterminationObjectID(predicate: NSPredicate.enactedDeterminationsNotYetUploadedToNightscout)
         )
 
-        guard let determination = fetchedDetermination, let nightscout = nightscoutAPI, isUploadEnabled else {
-            debug(.nightscout, "Abort NS uploadStatus")
+        let fetchedSuggestedDetermination = await determinationStorage.getOrefDeterminationNotYetUploadedToNightscout(
+            await determinationStorage
+                .fetchLastDeterminationObjectID(predicate: NSPredicate.suggestedDeterminationsNotYetUploadedToNightscout)
+        )
+
+        // Guard to ensure both determinations are not nil
+        guard fetchedEnactedDetermination != nil || fetchedSuggestedDetermination != nil else {
+            debug(.nightscout, "Both fetchedEnactedDetermination and fetchedSuggestedDetermination are nil. Aborting upload.")
             return
         }
 
-        let wasDeterminationEnacted = determination.deliverAt != nil && determination.timestamp != nil
-
-        var suggested = determination
-        suggested.timestamp = suggested.deliverAt
-
         let iob = storage.retrieve(OpenAPS.Monitor.iob, as: [IOBEntry].self)
 
         let loopIsClosed = settingsManager.settings.closedLoop
@@ -359,14 +360,15 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
         if loopIsClosed {
             openapsStatus = OpenAPSStatus(
                 iob: iob?.first,
-                suggested: wasDeterminationEnacted ? nil : suggested,
-                enacted: wasDeterminationEnacted ? determination : nil,
+                suggested: fetchedSuggestedDetermination,
+                enacted: fetchedEnactedDetermination,
                 version: "0.7.1"
             )
         } else {
+            // in this case, we will never see an actually enacted determination, so both timestamp and deliverAt are the same
             openapsStatus = OpenAPSStatus(
                 iob: iob?.first,
-                suggested: determination, // in this case, we will never see an actually enacted determination, so both timestamp and deliverAt are the same
+                suggested: fetchedSuggestedDetermination,
                 enacted: nil,
                 version: "0.7.1"
             )
@@ -397,6 +399,11 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
 
         storage.save(status, as: OpenAPS.Upload.nsStatus)
 
+        guard let nightscout = nightscoutAPI, isUploadEnabled else {
+            debug(.nightscout, "Abort NS uploadStatus")
+            return
+        }
+
         do {
             try await nightscout.uploadStatus(status)
             debug(.nightscout, "Status uploaded")
@@ -404,8 +411,13 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
             debug(.nightscout, error.localizedDescription)
         }
 
-        // If successful, update the isUploadedToNS property of the OrefDetermination objects
-        await updateOrefDeterminationAsUploaded([determination])
+        if let enacted = fetchedEnactedDetermination {
+            await updateOrefDeterminationAsUploaded([enacted])
+        }
+
+        if let suggested = fetchedSuggestedDetermination {
+            await updateOrefDeterminationAsUploaded([suggested])
+        }
 
         debug(.nightscout, "NSDeviceStatus with Determination uploaded")
 

+ 15 - 4
Model/Helper/Determination+helper.swift

@@ -32,11 +32,22 @@ extension NSPredicate {
         return NSPredicate(format: "deliverAt >= %@", date as NSDate)
     }
 
-    static var determinationsNotYetUploadedToNightscout: NSPredicate {
+    static var enactedDeterminationsNotYetUploadedToNightscout: NSPredicate {
         NSPredicate(
-            format: "deliverAt >= %@ AND isUploadedToNS == %@",
-            Date.oneDayAgo as NSDate,
-            false as NSNumber
+            format: "deliverAt >= %@ AND isUploadedToNS == %@ AND enacted == %@",
+            Date.sixHoursAgo as NSDate,
+            false as NSNumber,
+            true as NSNumber
+        )
+    }
+
+    static var suggestedDeterminationsNotYetUploadedToNightscout: NSPredicate {
+        NSPredicate(
+            format: "deliverAt >= %@ AND isUploadedToNS == %@ AND (enacted == %@ OR enacted == nil OR enacted != %@)",
+            Date.sixHoursAgo as NSDate,
+            false as NSNumber,
+            true as NSNumber,
+            true as NSNumber
         )
     }
 }