Pārlūkot izejas kodu

Merge pull request #139 from dnzxy/fix-fetch-entities

polscm32 1 gadu atpakaļ
vecāks
revīzija
e271df8dff

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
FreeAPS/Resources/javascript/bundle/determine-basal.js


+ 1 - 1
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -198,7 +198,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
             key: "date",
             ascending: false,
             fetchLimit: 6
-        )
+        ) as? [GlucoseStored]
     }
 
     private func processGlucose() -> [BloodGlucose] {

+ 2 - 2
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -915,7 +915,7 @@ extension OpenAPS {
             key: "date",
             ascending: false,
             fetchLimit: 1
-        )
+        ) as? [TempTargetStored] ?? []
     }
 
     func fetchActiveOverrides() -> [OverrideStored] {
@@ -926,7 +926,7 @@ extension OpenAPS {
             key: "date",
             ascending: false,
             fetchLimit: 1
-        )
+        ) as? [OverrideStored] ?? []
     }
 
     func fetchHistoricalTDDData(from date: Date) -> [[String: Any]] {

+ 2 - 2
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -264,14 +264,14 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
 
     func fetchLatestGlucose() -> GlucoseStored? {
         let predicate = NSPredicate.predicateFor20MinAgo
-        return CoreDataStack.shared.fetchEntities(
+        return (CoreDataStack.shared.fetchEntities(
             ofType: GlucoseStored.self,
             onContext: coredataContext,
             predicate: predicate,
             key: "date",
             ascending: false,
             fetchLimit: 1
-        ).first
+        ) as? [GlucoseStored] ?? []).first
     }
 
     // Fetch glucose that is not uploaded to Nightscout yet

+ 1 - 1
FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift

@@ -60,7 +60,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                         key: "timestamp",
                         ascending: false,
                         batchSize: 50
-                    )
+                    ) as? [PumpEventStored] ?? []
 
                     switch event.type {
                     case .bolus:

+ 3 - 2
FreeAPS/Sources/Shortcuts/State/StateIntentRequest.swift

@@ -68,7 +68,7 @@ final class StateIntentRequest: BaseIntentsRequest {
                 key: "date",
                 ascending: false,
                 fetchLimit: 2
-            )
+            ) as? [GlucoseStored] ?? []
 
             guard let lastValue = results.first else { throw StateIntentError.NoBG }
 
@@ -109,7 +109,8 @@ final class StateIntentRequest: BaseIntentsRequest {
             key: "deliverAt",
             ascending: false,
             fetchLimit: 1
-        )
+        ) as? [OrefDetermination] ?? []
+
         let iobAsDouble = Double(truncating: (results.first?.iob ?? 0.0) as NSNumber)
         let cobAsDouble = Double(truncating: (results.first?.cob ?? 0) as NSNumber)
 

+ 13 - 17
Model/CoreDataStack.swift

@@ -313,8 +313,8 @@ extension CoreDataStack {
         propertiesToFetch: [String]? = nil,
         callingFunction: String = #function,
         callingClass: String = #fileID
-    ) -> [T] {
-        let request = NSFetchRequest<T>(entityName: String(describing: type))
+    ) -> [Any] {
+        let request = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: type))
         request.sortDescriptors = [NSSortDescriptor(key: key, ascending: ascending)]
         request.predicate = predicate
         if let limit = fetchLimit {
@@ -323,9 +323,9 @@ extension CoreDataStack {
         if let batchSize = batchSize {
             request.fetchBatchSize = batchSize
         }
-        if let propertiesTofetch = propertiesToFetch {
-            request.propertiesToFetch = propertiesTofetch
-            request.resultType = .managedObjectResultType
+        if let propertiesToFetch = propertiesToFetch {
+            request.propertiesToFetch = propertiesToFetch
+            request.resultType = .dictionaryResultType
         } else {
             request.resultType = .managedObjectResultType
         }
@@ -333,23 +333,22 @@ extension CoreDataStack {
         context.name = "fetchContext"
         context.transactionAuthor = "fetchEntities"
 
-        var result: [T]?
-
         /// we need to ensure that the fetch immediately returns a value as long as the whole app does not use the async await pattern, otherwise we could perform this asynchronously with backgroundContext.perform and not block the thread
-        context.performAndWait {
+        return context.performAndWait {
             do {
-//                debugPrint(
-//                    "Fetching \(T.self) in \(callingFunction) from \(callingClass): \(DebuggingIdentifiers.succeeded) on Thread: \(Thread.current)"
-//                )
-                result = try context.fetch(request)
+                if propertiesToFetch != nil {
+                    return try context.fetch(request) as? [[String: Any]] ?? []
+                } else {
+                    return try context.fetch(request) as? [T] ?? []
+                }
             } catch let error as NSError {
                 debugPrint(
                     "Fetching \(T.self) in \(callingFunction) from \(callingClass): \(DebuggingIdentifiers.failed) \(error) on Thread: \(Thread.current)"
                 )
+
+                return []
             }
         }
-
-        return result ?? []
     }
 
     // Fetch Async
@@ -386,9 +385,6 @@ extension CoreDataStack {
 
         return await context.perform {
             do {
-//                debugPrint(
-//                    "Fetching \(T.self) in \(callingFunction) from \(callingClass): \(DebuggingIdentifiers.succeeded) on Thread: \(Thread.current)"
-//                )
                 if propertiesToFetch != nil {
                     return try context.fetch(request) as? [[String: Any]] ?? []
                 } else {

+ 3 - 2
oref0_source_version.txt

@@ -1,7 +1,8 @@
-oref0 branch: TToref-reset - git version: e0caaa0
+oref0 branch: dev - git version: 0ff47a3
 
 Last commits:
-e0caaa0 revert to standard HBT calculation
+0ff47a3 fix weightedAverage, always calculate TDD
+e274bb0 revert to standard HBT calculation
 363fd11 Merge pull request #28 from bjornoleh/harmonise_defaults
 2d695e1 index.js: set enableUAM to false, and remove whitespace in L11
 8f5f820 Harmonise profile defaults with openaps/oref0

+ 126 - 127
trio-oref/lib/determine-basal/determine-basal.js

@@ -409,157 +409,156 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
 
     // Calculate tdd ----------------------------------------------------------------------
 
-    if (dynISFenabled) {
-        //Bolus:
-        for (let i = 0; i < pumphistory.length; i++) {
-            if (pumphistory[i]._type == "Bolus") {
-                bolusInsulin += pumphistory[i].amount;
-            }
+    //Bolus:
+    for (let i = 0; i < pumphistory.length; i++) {
+        if (pumphistory[i]._type == "Bolus") {
+            bolusInsulin += pumphistory[i].amount;
         }
+    }
 
-        // Temp basals:
-        for (let j = 1; j < pumphistory.length; j++) {
-            if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
-                current = j;
-                quota = pumphistory[j].rate;
-                var duration = pumphistory[j-1]['duration (min)'] / 60;
-                var origDur = duration;
-                var pastTime = new Date(pumphistory[j-1].timestamp);
-                var morePresentTime = new Date(pastTime);
-                var substractTimeOfRewind = 0;
-                // If temp basal hasn't yet ended, use now as end date for calculation
-                do {
-                    j--;
-                    if (j == 0) {
-                        morePresentTime =  new Date();
-                        break;
-                    }
-                    else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend")  {
-                        morePresentTime = new Date(pumphistory[j].timestamp);
-                        break;
-                    }
-                    // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
-                    var pp = j-2;
-                    if (pp >= 0) {
-                        if (pumphistory[pp]._type == "Rewind") {
-                            let rewindTimestamp = pumphistory[pp].timestamp;
-                            // There can be several Prime events
-                            while (pp - 1 >= 0) {
-                                pp -= 1;
-                                if (pumphistory[pp]._type == "Prime") {
-                                    substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
-                                } else { break }
-                            }
+    // Temp basals:
+    for (let j = 1; j < pumphistory.length; j++) {
+        if (pumphistory[j]._type == "TempBasal" && pumphistory[j].rate > 0) {
+            current = j;
+            quota = pumphistory[j].rate;
+            var duration = pumphistory[j-1]['duration (min)'] / 60;
+            var origDur = duration;
+            var pastTime = new Date(pumphistory[j-1].timestamp);
+            var morePresentTime = new Date(pastTime);
+            var substractTimeOfRewind = 0;
+            // If temp basal hasn't yet ended, use now as end date for calculation
+            do {
+                j--;
+                if (j == 0) {
+                    morePresentTime =  new Date();
+                    break;
+                }
+                else if (pumphistory[j]._type == "TempBasal" || pumphistory[j]._type == "PumpSuspend")  {
+                    morePresentTime = new Date(pumphistory[j].timestamp);
+                    break;
+                }
+                // During the time the Medtronic pumps are rewinded and primed, this duration of suspened insulin delivery needs to be accounted for.
+                var pp = j-2;
+                if (pp >= 0) {
+                    if (pumphistory[pp]._type == "Rewind") {
+                        let rewindTimestamp = pumphistory[pp].timestamp;
+                        // There can be several Prime events
+                        while (pp - 1 >= 0) {
+                            pp -= 1;
+                            if (pumphistory[pp]._type == "Prime") {
+                                substractTimeOfRewind = (pumphistory[pp].timestamp - rewindTimestamp) / 36e5;
+                            } else { break }
+                        }
 
-                            // If Medtronic user forgets to insert infusion set
-                            if (substractTimeOfRewind >= duration) {
-                                morePresentTime = new Date(rewindTimestamp);
-                                substractTimeOfRewind = 0;
-                            }
+                        // If Medtronic user forgets to insert infusion set
+                        if (substractTimeOfRewind >= duration) {
+                            morePresentTime = new Date(rewindTimestamp);
+                            substractTimeOfRewind = 0;
                         }
                     }
-                } while (j > 0);
-
-                var diff = (morePresentTime - pastTime) / 36e5;
-                if (diff < origDur) {
-                    duration = diff;
                 }
+            } while (j > 0);
 
-                insulin = quota * (duration - substractTimeOfRewind);
-                tempInsulin += accountForIncrements(insulin);
-                j = current;
+            var diff = (morePresentTime - pastTime) / 36e5;
+            if (diff < origDur) {
+                duration = diff;
             }
+
+            insulin = quota * (duration - substractTimeOfRewind);
+            tempInsulin += accountForIncrements(insulin);
+            j = current;
         }
-        //  Check and count for when basals are delivered with a scheduled basal rate.
-        //  1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
-        //  2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
-        //  3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
-        //  4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
-        //  To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
-        //
-        for (let k = 0; k < pumphistory.length; k++) {
-            // Check for 0 temp basals with 0 min duration.
-            insulin = 0;
-            if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
-                let time1 = new Date(pumphistory[k].timestamp);
-                let time2 = new Date(time1);
-                let l = k;
-                do {
-                    if (l > 0) {
-                        --l;
-                        if (pumphistory[l]._type == "TempBasal") {
-                            time2 = new Date(pumphistory[l].timestamp);
-                            break;
-                        }
+    }
+    //  Check and count for when basals are delivered with a scheduled basal rate.
+    //  1. Check for 0 temp basals with 0 min duration. This is for when ending a manual temp basal and (perhaps) continuing in open loop for a while.
+    //  2. Check for temp basals that completes. This is for when disconnected from link/iphone, or when in open loop.
+    //  3. Account for a punp suspension. This is for when pod screams or when MDT or pod is manually suspended.
+    //  4. Account for a pump resume (in case pump/cgm is disconnected before next loop).
+    //  To do: are there more circumstances when scheduled basal rates are used? Do we need to care about "Prime" and "Rewind" with MDT pumps?
+    //
+    for (let k = 0; k < pumphistory.length; k++) {
+        // Check for 0 temp basals with 0 min duration.
+        insulin = 0;
+        if (pumphistory[k]['duration (min)'] == 0 || pumphistory[k]._type == "PumpResume") {
+            let time1 = new Date(pumphistory[k].timestamp);
+            let time2 = new Date(time1);
+            let l = k;
+            do {
+                if (l > 0) {
+                    --l;
+                    if (pumphistory[l]._type == "TempBasal") {
+                        time2 = new Date(pumphistory[l].timestamp);
+                        break;
                     }
-                } while (l > 0);
-                // duration of current scheduled basal in h
-                let basDuration = (time2 - time1) / 36e5;
-
-                if (basDuration > 0) {
-                    scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
                 }
+            } while (l > 0);
+            // duration of current scheduled basal in h
+            let basDuration = (time2 - time1) / 36e5;
+
+            if (basDuration > 0) {
+                scheduledBasalInsulin += calcScheduledBasalInsulin(time2, time1);
             }
         }
+    }
 
-        // Check for temp basals that completes
-        for (let n = pumphistory.length -1; n > 0; n--) {
-            if (pumphistory[n]._type == "TempBasalDuration") {
-                // duration in hours
-                let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
-                // time of old temp basal
-                let oldTime = new Date(pumphistory[n].timestamp);
-                var newTime = new Date(oldTime);
-                let o = n;
-                do {
-                    --o;
-                    if (o >= 0) {
-                        if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
-                            // time of next (new) temp basal or a pump suspension
-                            newTime = new Date(pumphistory[o].timestamp);
-                            break;
-                        }
+    // Check for temp basals that completes
+    for (let n = pumphistory.length -1; n > 0; n--) {
+        if (pumphistory[n]._type == "TempBasalDuration") {
+            // duration in hours
+            let oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
+            // time of old temp basal
+            let oldTime = new Date(pumphistory[n].timestamp);
+            var newTime = new Date(oldTime);
+            let o = n;
+            do {
+                --o;
+                if (o >= 0) {
+                    if (pumphistory[o]._type == "TempBasal" || pumphistory[o]._type == "PumpSuspend") {
+                        // time of next (new) temp basal or a pump suspension
+                        newTime = new Date(pumphistory[o].timestamp);
+                        break;
                     }
-                } while (o > 0);
-
-                // When latest temp basal is index 0 in pump history
-                if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
-                    newTime = new Date();
-                    oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
                 }
+            } while (o > 0);
 
-                let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
-                let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
-                // if duration of scheduled basal is more than 0
-                if (timeOfbasal > 0) {
-                    // Timestamp after completed temp basal
-                    let timeOfScheduledBasal =  addTimeToDate(oldTime, oldBasalDuration);
-                    scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
-                }
+            // When latest temp basal is index 0 in pump history
+            if (n == 0 && pumphistory[0]._type == "TempBasalDuration") {
+                newTime = new Date();
+                oldBasalDuration = pumphistory[n]['duration (min)'] / 60;
+            }
+
+            let tempBasalTimeDifference = (newTime - oldTime) / 36e5;
+            let timeOfbasal = tempBasalTimeDifference - oldBasalDuration;
+            // if duration of scheduled basal is more than 0
+            if (timeOfbasal > 0) {
+                // Timestamp after completed temp basal
+                let timeOfScheduledBasal =  addTimeToDate(oldTime, oldBasalDuration);
+                scheduledBasalInsulin += calcScheduledBasalInsulin(newTime, timeOfScheduledBasal);
             }
         }
+    }
 
-        tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
+    tdd = bolusInsulin + tempInsulin + scheduledBasalInsulin;
 
 
-        var insulin_ = {
-            TDD: round(tdd, 5),
-            bolus: round(bolusInsulin, 5),
-            temp_basal: round(tempInsulin, 5),
-            scheduled_basal: round(scheduledBasalInsulin, 5)
-        }
+    var insulin_ = {
+        TDD: round(tdd, 5),
+        bolus: round(bolusInsulin, 5),
+        temp_basal: round(tempInsulin, 5),
+        scheduled_basal: round(scheduledBasalInsulin, 5)
+    }
 
-        if (pumpData > 21) {
-            logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
-            logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
-            logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
-            logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
-            logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
+    if (pumpData > 21) {
+        logBolus = ". Bolus insulin: " + bolusInsulin.toPrecision(5) + " U";
+        logTempBasal = ". Temporary basal insulin: " + tempInsulin.toPrecision(5) + " U";
+        logBasal = ". Insulin with scheduled basal rate: " + scheduledBasalInsulin.toPrecision(5) + " U";
+        logtdd = " TDD past 24h is: " + tdd.toPrecision(5) + " U";
+        logOutPut = dataLog + logtdd + logBolus + logTempBasal + logBasal;
 
-            tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) +  "% Basal";
+        tddReason = ", TDD: " + round(tdd,2) + " U, " + round(bolusInsulin/tdd*100,0) + "% Bolus " + round((tempInsulin+scheduledBasalInsulin)/tdd*100,0) +  "% Basal";
+
+    } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
 
-        } else { tddReason = ", TDD: Not enough pumpData (< 21h)"; }
-    }
 
     var tdd_before = tdd;
 
@@ -643,7 +642,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
 
     // Use weighted TDD average
     tdd_before = tdd;
-    if (weightPercentage < 1 && weightedAverage > 0) {
+    if (weightPercentage < 1 && weightedAverage > 1) {
         tdd = weightedAverage;
         console.log("Using weighted TDD average: " + round(tdd,2) + " U, instead of past 24 h (" + round(tdd_before,2) + " U), weight: " + weightPercentage);
         weightLog = ", Weighted TDD: " + round(tdd,2) + " U";