Просмотр исходного кода

New version of AH for carbs with :
- correction for fetching NS carbs
- more control before writing Carbs in AH

Pierre L 3 лет назад
Родитель
Сommit
db8a02ac8b

+ 1 - 1
FreeAPS/Sources/Models/CarbsEntry.swift

@@ -1,7 +1,7 @@
 import Foundation
 import Foundation
 
 
 struct CarbsEntry: JSON, Equatable, Hashable {
 struct CarbsEntry: JSON, Equatable, Hashable {
-    let id: UUID?
+    let id: String?
     let createdAt: Date
     let createdAt: Date
     let carbs: Decimal
     let carbs: Decimal
     let enteredBy: String?
     let enteredBy: String?

+ 3 - 2
FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift

@@ -31,14 +31,15 @@ extension AddCarbs {
                 let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
                 let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
                 carbsStorage.storeCarbs([
                 carbsStorage.storeCarbs([
                     CarbsEntry(
                     CarbsEntry(
-                        id: UUID(), createdAt: date + (newdate * 3600), carbs: carbequiv, enteredBy: CarbsEntry.manual
+                        id: UUID().uuidString, createdAt: date + (newdate * 3600), carbs: carbequiv, enteredBy: CarbsEntry.manual
                     )
                     )
                 ])
                 ])
                 counter -= 1
                 counter -= 1
             }
             }
             // Store the real carbs
             // Store the real carbs
             if carbs > 0 {
             if carbs > 0 {
-                carbsStorage.storeCarbs([CarbsEntry(id: UUID(), createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
+                carbsStorage
+                    .storeCarbs([CarbsEntry(id: UUID().uuidString, createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
             }
             }
 
 
             if settingsManager.settings.skipBolusScreenAfterCarbs {
             if settingsManager.settings.skipBolusScreenAfterCarbs {

+ 3 - 3
FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift

@@ -52,7 +52,7 @@ enum DataTable {
     }
     }
 
 
     class Treatment: Identifiable, Hashable, Equatable {
     class Treatment: Identifiable, Hashable, Equatable {
-        let id: UUID
+        let id: String
         let idPumpEvent: String?
         let idPumpEvent: String?
         let units: GlucoseUnits
         let units: GlucoseUnits
         let type: DataType
         let type: DataType
@@ -75,7 +75,7 @@ enum DataTable {
             amount: Decimal? = nil,
             amount: Decimal? = nil,
             secondAmount: Decimal? = nil,
             secondAmount: Decimal? = nil,
             duration: Decimal? = nil,
             duration: Decimal? = nil,
-            id: UUID? = nil,
+            id: String? = nil,
             idPumpEvent: String? = nil
             idPumpEvent: String? = nil
         ) {
         ) {
             self.units = units
             self.units = units
@@ -84,7 +84,7 @@ enum DataTable {
             self.amount = amount
             self.amount = amount
             self.secondAmount = secondAmount
             self.secondAmount = secondAmount
             self.duration = duration
             self.duration = duration
-            self.id = id ?? UUID()
+            self.id = id ?? UUID().uuidString
             self.idPumpEvent = idPumpEvent
             self.idPumpEvent = idPumpEvent
         }
         }
 
 

+ 1 - 1
FreeAPS/Sources/Modules/DataTable/DataTableProvider.swift

@@ -23,7 +23,7 @@ extension DataTable {
 
 
         func deleteCarbs(_ treatement: Treatment) {
         func deleteCarbs(_ treatement: Treatment) {
             nightscoutManager.deleteCarbs(at: treatement.date)
             nightscoutManager.deleteCarbs(at: treatement.date)
-            healthkitManager.deleteCarbs(syncID: treatement.id.uuidString)
+            healthkitManager.deleteCarbs(syncID: treatement.id)
         }
         }
 
 
         func deleteInsulin(_ treatement: Treatment) {
         func deleteInsulin(_ treatement: Treatment) {

+ 23 - 4
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -190,8 +190,10 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver {
 
 
         func save(samples: [HKSample]) {
         func save(samples: [HKSample]) {
             let sampleIDs = samples.compactMap(\.syncIdentifier)
             let sampleIDs = samples.compactMap(\.syncIdentifier)
+            let sampleDates = samples.map(\.startDate)
             let samplesToSave = carbsWithId
             let samplesToSave = carbsWithId
-                .filter { !sampleIDs.contains($0.id!.uuidString) }
+                .filter { !sampleIDs.contains($0.id!) } // id existing in AH
+                .filter { !sampleDates.contains($0.createdAt) } // not id but exaclty the same datetime
                 .map {
                 .map {
                     HKQuantitySample(
                     HKQuantitySample(
                         type: sampleType,
                         type: sampleType,
@@ -199,8 +201,8 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver {
                         start: $0.createdAt,
                         start: $0.createdAt,
                         end: $0.createdAt,
                         end: $0.createdAt,
                         metadata: [
                         metadata: [
-                            HKMetadataKeyExternalUUID: $0.id?.uuidString ?? "_id",
-                            HKMetadataKeySyncIdentifier: $0.id?.uuidString ?? "_id",
+                            HKMetadataKeyExternalUUID: $0.id ?? "_id",
+                            HKMetadataKeySyncIdentifier: $0.id ?? "_id",
                             HKMetadataKeySyncVersion: 1,
                             HKMetadataKeySyncVersion: 1,
                             Config.freeAPSMetaKey: true
                             Config.freeAPSMetaKey: true
                         ]
                         ]
@@ -210,7 +212,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver {
             healthKitStore.save(samplesToSave) { _, _ in }
             healthKitStore.save(samplesToSave) { _, _ in }
         }
         }
 
 
-        loadSamplesFromHealth(sampleType: sampleType, withIDs: carbsWithId.compactMap(\.id?.uuidString))
+        loadSamplesFromHealth(sampleType: sampleType)
             .receive(on: processQueue)
             .receive(on: processQueue)
             .sink(receiveValue: save)
             .sink(receiveValue: save)
             .store(in: &lifetime)
             .store(in: &lifetime)
@@ -344,6 +346,23 @@ final class BaseHealthKitManager: HealthKitManager, Injectable, CarbsObserver {
         }
         }
     }
     }
 
 
+    /// Try to load samples from Health store
+    private func loadSamplesFromHealth(
+        sampleType: HKQuantityType
+    ) -> Future<[HKSample], Never> {
+        Future { promise in
+            let query = HKSampleQuery(
+                sampleType: sampleType,
+                predicate: nil,
+                limit: 1000,
+                sortDescriptors: nil
+            ) { _, results, _ in
+                promise(.success((results as? [HKQuantitySample]) ?? []))
+            }
+            self.healthKitStore.execute(query)
+        }
+    }
+
     /// Try to load samples from Health store with id and do some work
     /// Try to load samples from Health store with id and do some work
     private func loadSamplesFromHealth(
     private func loadSamplesFromHealth(
         sampleType: HKQuantityType,
         sampleType: HKQuantityType,

+ 1 - 1
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -220,7 +220,7 @@ extension BaseWatchManager: WCSessionDelegate {
 
 
         if let carbs = message["carbs"] as? Double, carbs > 0 {
         if let carbs = message["carbs"] as? Double, carbs > 0 {
             carbsStorage.storeCarbs([
             carbsStorage.storeCarbs([
-                CarbsEntry(id: UUID(), createdAt: Date(), carbs: Decimal(carbs), enteredBy: CarbsEntry.manual)
+                CarbsEntry(id: UUID().uuidString, createdAt: Date(), carbs: Decimal(carbs), enteredBy: CarbsEntry.manual)
             ])
             ])
 
 
             if settingsManager.settings.skipBolusScreenAfterCarbs {
             if settingsManager.settings.skipBolusScreenAfterCarbs {