Przeglądaj źródła

Calender Events
* Get IOB and COB for Calender events from CoreData.
* If loop older than 15 minutes display a 🚫

Jon Mårtensson 2 lat temu
rodzic
commit
c438accf78

+ 6 - 1
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21754" systemVersion="22F82" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22222" systemVersion="22G90" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
     <entity name="BGaverages" representedClassName="BGaverages" syncable="YES" codeGenerationType="class">
         <attribute name="average" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <attribute name="average_1" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
@@ -38,6 +38,11 @@
         <attribute name="tempBasal" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <relationship name="insulin" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedInsulinDistribution" inverseEntity="Oref0Suggestion"/>
     </entity>
+    <entity name="LastLoop" representedClassName="LastLoop" syncable="YES" codeGenerationType="class">
+        <attribute name="cob" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
+        <attribute name="iob" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
+        <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+    </entity>
     <entity name="LoopStatRecord" representedClassName="LoopStatRecord" syncable="YES" codeGenerationType="class">
         <attribute name="duration" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
         <attribute name="end" optional="YES" attributeType="Date" usesScalarValueType="NO"/>

+ 9 - 0
FreeAPS/Sources/APS/APSManager.swift

@@ -711,6 +711,15 @@ final class BaseAPSManager: APSManager, Injectable {
 
             storage.save(enacted, as: OpenAPS.Enact.enacted)
 
+            // Save to CoreData also. TO DO: Remove the JSON saving after some testing.
+            coredataContext.perform {
+                let saveLastLoop = LastLoop(context: self.coredataContext)
+                saveLastLoop.iob = (enacted.iob ?? 0) as NSDecimalNumber
+                saveLastLoop.cob = (enacted.cob ?? 0) as NSDecimalNumber
+                saveLastLoop.timestamp = (enacted.timestamp ?? .distantPast) as Date
+                try? self.coredataContext.save()
+            }
+
             debug(.apsManager, "Suggestion enacted. Received: \(received)")
             DispatchQueue.main.async {
                 self.broadcaster.notify(EnactedSuggestionObserver.self, on: .main) {

+ 31 - 9
FreeAPS/Sources/Services/Calendar/CalendarManager.swift

@@ -1,4 +1,5 @@
 import Combine
+import CoreData
 import EventKit
 import Swinject
 
@@ -24,6 +25,8 @@ final class BaseCalendarManager: CalendarManager, Injectable {
         setupGlucose()
     }
 
+    let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
+
     func requestAccessIfNeeded() -> AnyPublisher<Bool, Never> {
         Future { promise in
             let status = EKEventStore.authorizationStatus(for: .event)
@@ -63,9 +66,30 @@ final class BaseCalendarManager: CalendarManager, Injectable {
         // create an event now
         let event = EKEvent(eventStore: eventStore)
 
+        // Calendar settings
+        let displeyCOBandIOB = settingsManager.settings.displayCalendarIOBandCOB
+        let displayEmojis = settingsManager.settings.displayCalendarEmojis
+
+        // Latest Loop data (from CoreData)
+        var freshLoop: Double = 20
+        var lastLoop = [LastLoop]()
+        if displeyCOBandIOB || displayEmojis {
+            coredataContext.performAndWait {
+                let requestLastLoop = LastLoop.fetchRequest() as NSFetchRequest<LastLoop>
+                let sortLoops = NSSortDescriptor(key: "timestamp", ascending: false)
+                requestLastLoop.sortDescriptors = [sortLoops]
+                requestLastLoop.fetchLimit = 1
+                try? lastLoop = coredataContext.fetch(requestLastLoop)
+            }
+            freshLoop = -1 * (lastLoop.first?.timestamp ?? .distantPast).timeIntervalSinceNow.minutes
+        }
+
         var glucoseIcon = "🟢"
-        glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon
-        glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon
+        if displayEmojis {
+            glucoseIcon = Double(glucoseValue) <= Double(settingsManager.settings.low) ? "🔴" : glucoseIcon
+            glucoseIcon = Double(glucoseValue) >= Double(settingsManager.settings.high) ? "🟠" : glucoseIcon
+            glucoseIcon = freshLoop > 15 ? "🚫" : glucoseIcon
+        }
 
         let glucoseText = glucoseFormatter
             .string(from: Double(
@@ -79,18 +103,17 @@ final class BaseCalendarManager: CalendarManager, Injectable {
                     .string(from: Double(settingsManager.settings.units == .mmolL ? $0.asMmolL : Decimal($0)) as NSNumber)!
             } ?? "--"
 
-        let fetchedSuggestion = storage.retrieve(OpenAPS.Enact.enacted, as: Suggestion.self)
-        let iobText = iobFormatter.string(from: (fetchedSuggestion?.iob ?? 0) as NSNumber) ?? ""
-        let cobText = cobFormatter.string(from: (fetchedSuggestion?.cob ?? 0) as NSNumber) ?? ""
+        let iobText = iobFormatter.string(from: (lastLoop.first?.iob ?? 0) as NSNumber) ?? ""
+        let cobText = cobFormatter.string(from: (lastLoop.first?.cob ?? 0) as NSNumber) ?? ""
 
-        var glucoseDisplayText = settingsManager.settings.displayCalendarEmojis ? glucoseIcon + " " : ""
+        var glucoseDisplayText = displayEmojis ? glucoseIcon + " " : ""
         glucoseDisplayText += glucoseText + " " + directionText + " " + deltaText
 
         var iobDisplayText = ""
         var cobDisplayText = ""
 
-        if settingsManager.settings.displayCalendarIOBandCOB {
-            if settingsManager.settings.displayCalendarEmojis {
+        if displeyCOBandIOB {
+            if displayEmojis {
                 iobDisplayText += "💉"
                 cobDisplayText += "🥨"
             } else {
@@ -99,7 +122,6 @@ final class BaseCalendarManager: CalendarManager, Injectable {
             }
             iobDisplayText += " " + iobText
             cobDisplayText += " " + cobText
-
             event.location = iobDisplayText + " " + cobDisplayText
         }