Jelajahi Sumber

Upload temp targets

Ivan Valkou 5 tahun lalu
induk
melakukan
63a14a610c

+ 0 - 0
FreeAPS/Resources/json/defaults/nightscout/uploaded-temptargets.json


+ 1 - 0
FreeAPS/Sources/APS/OpenAPS/Constants.swift

@@ -70,6 +70,7 @@ extension OpenAPS {
     enum Nightscout {
         static let uploadedPumphistory = "upload/uploaded-pumphistory.json"
         static let uploadedCarbs = "upload/uploaded-carbs.json"
+        static let uploadedTempTargets = "upload/uploaded-temptargets.json"
     }
 
     enum FreeAPS {

+ 4 - 1
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -9,6 +9,7 @@ protocol CarbsObserver {
 protocol CarbsStorage {
     func storeCarbs(_ carbs: [CarbsEntry])
     func syncDate() -> Date
+    func recent() -> [CarbsEntry]
     func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
 }
 
@@ -68,7 +69,9 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                 bolus: nil,
                 insulin: nil,
                 notes: nil,
-                carbs: $0.carbs
+                carbs: $0.carbs,
+                targetTop: nil,
+                targetBottom: nil
             )
         }
         return Array(Set(treatments).subtracting(Set(uploaded)))

+ 9 - 3
FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift

@@ -195,7 +195,9 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                     bolus: nil,
                     insulin: nil,
                     notes: nil,
-                    carbs: nil
+                    carbs: nil,
+                    targetTop: nil,
+                    targetBottom: nil
                 ))
             case .tempBasalDuration:
                 if var last = result.popLast(), last.eventType == .nsTempBasal, last.createdAt == event.timestamp {
@@ -223,7 +225,9 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                     bolus: event,
                     insulin: event.amount,
                     notes: nil,
-                    carbs: nil
+                    carbs: nil,
+                    targetTop: nil,
+                    targetBottom: nil
                 )
             case .journalCarbs:
                 return NigtscoutTreatment(
@@ -238,7 +242,9 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                     bolus: nil,
                     insulin: nil,
                     notes: nil,
-                    carbs: Decimal(event.carbInput ?? 0)
+                    carbs: Decimal(event.carbInput ?? 0),
+                    targetTop: nil,
+                    targetBottom: nil
                 )
             default: return nil
             }

+ 41 - 1
FreeAPS/Sources/APS/Storage/TempTargetsStorage.swift

@@ -2,14 +2,21 @@ import Foundation
 import SwiftDate
 import Swinject
 
+protocol TempTargetsObserver {
+    func tempTargetsDidUpdate(_ targers: [TempTarget])
+}
+
 protocol TempTargetsStorage {
     func storeTempTargets(_ targets: [TempTarget])
     func syncDate() -> Date
+    func recent() -> [TempTarget]
+    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
 }
 
 final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
     private let processQueue = DispatchQueue(label: "BaseTempTargetsStorage.processQueue")
     @Injected() private var storage: FileStorage!
+    @Injected() private var broadcaster: Broadcaster!
 
     init(resolver: Resolver) {
         injectServices(resolver)
@@ -18,13 +25,17 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
     func storeTempTargets(_ targets: [TempTarget]) {
         processQueue.sync {
             let file = OpenAPS.Settings.tempTargets
+            var uniqEvents: [TempTarget] = []
             try? self.storage.transaction { storage in
                 try storage.append(targets, to: file, uniqBy: \.createdAt)
-                let uniqEvents = try storage.retrieve(file, as: [TempTarget].self)
+                uniqEvents = try storage.retrieve(file, as: [TempTarget].self)
                     .filter { $0.createdAt.addingTimeInterval(1.days.timeInterval) > Date() }
                     .sorted { $0.createdAt > $1.createdAt }
                 try storage.save(Array(uniqEvents), as: file)
             }
+            broadcaster.notify(TempTargetsObserver.self, on: processQueue) {
+                $0.tempTargetsDidUpdate(uniqEvents)
+            }
         }
     }
 
@@ -36,4 +47,33 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
         }
         return recent.createdAt.addingTimeInterval(-6.minutes.timeInterval)
     }
+
+    func recent() -> [TempTarget] {
+        (try? storage.retrieve(OpenAPS.Settings.tempTargets, as: [TempTarget].self))?.reversed() ?? []
+    }
+
+    func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment] {
+        let uploaded = (try? storage.retrieve(OpenAPS.Nightscout.uploadedTempTargets, as: [NigtscoutTreatment].self)) ?? []
+
+        let eventsManual = recent().filter { $0.enteredBy == CarbsEntry.manual }
+        let treatments = eventsManual.map {
+            NigtscoutTreatment(
+                duration: Int($0.duration),
+                rawDuration: nil,
+                rawRate: nil,
+                absolute: nil,
+                rate: nil,
+                eventType: .nsTempTarget,
+                createdAt: $0.createdAt,
+                entededBy: TempTarget.manual,
+                bolus: nil,
+                insulin: nil,
+                notes: nil,
+                carbs: nil,
+                targetTop: $0.targetTop,
+                targetBottom: $0.targetBottom
+            )
+        }
+        return Array(Set(treatments).subtracting(Set(uploaded)))
+    }
 }

+ 5 - 1
FreeAPS/Sources/Models/NightscoutTreatment.swift

@@ -6,13 +6,15 @@ struct NigtscoutTreatment: JSON, Hashable, Equatable {
     var rawRate: PumpHistoryEvent?
     var absolute: Decimal?
     var rate: Decimal?
-    var eventType: PumpHistoryEventType
+    var eventType: EventType
     var createdAt: Date?
     var entededBy: String?
     var bolus: PumpHistoryEvent?
     var insulin: Decimal?
     var notes: String?
     var carbs: Decimal?
+    let targetTop: Decimal?
+    let targetBottom: Decimal?
 
     static let local = "freeaps-x://local"
 
@@ -41,5 +43,7 @@ extension NigtscoutTreatment {
         case insulin
         case notes
         case carbs
+        case targetTop
+        case targetBottom
     }
 }

+ 3 - 2
FreeAPS/Sources/Models/PumpHistoryEvent.swift

@@ -2,7 +2,7 @@ import Foundation
 
 struct PumpHistoryEvent: JSON {
     let id: String
-    let type: PumpHistoryEventType
+    let type: EventType
     let timestamp: Date
     let amount: Decimal?
     let duration: Int?
@@ -12,7 +12,7 @@ struct PumpHistoryEvent: JSON {
     let carbInput: Int?
 }
 
-enum PumpHistoryEventType: String, JSON {
+enum EventType: String, JSON {
     case bolus = "Bolus"
     case mealBulus = "Meal Bolus"
     case correctionBolus = "Correction Bolus"
@@ -28,6 +28,7 @@ enum PumpHistoryEventType: String, JSON {
 
     case nsTempBasal = "Temp Basal"
     case nsCarbCorrection = "Carb Correction"
+    case nsTempTarget = "Temporary Target"
 }
 
 enum TempType: String, JSON {

+ 2 - 1
FreeAPS/Sources/Services/Network/NightscoutAPI.swift

@@ -124,7 +124,8 @@ extension NightscoutAPI {
         components.path = Config.treatmentsPath
         components.queryItems = [
             URLQueryItem(name: "find[eventType]", value: "Temporary+Target"),
-            URLQueryItem(name: "find[enteredBy][$ne]", value: TempTarget.manual)
+            URLQueryItem(name: "find[enteredBy][$ne]", value: TempTarget.manual),
+            URLQueryItem(name: "find[enteredBy][$ne]", value: NigtscoutTreatment.local)
         ]
         if let date = sinceDate {
             let dateItem = URLQueryItem(

+ 22 - 3
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -41,6 +41,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     private func subscribe() {
         broadcaster.register(PumpHistoryObserver.self, observer: self)
         broadcaster.register(CarbsObserver.self, observer: self)
+        broadcaster.register(TempTargetsObserver.self, observer: self)
     }
 
     func fetchGlucose() -> AnyPublisher<Void, Never> {
@@ -102,7 +103,19 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
 
     private func uploadStatus() {}
 
-    private func uploadPumpHistory(_ treatments: [NigtscoutTreatment], fileToSave: String) {
+    private func uploadPumpHistory() {
+        uploadTreatments(pumpHistoryStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedPumphistory)
+    }
+
+    private func uploadCarbs() {
+        uploadTreatments(carbsStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedCarbs)
+    }
+
+    private func uploadTempTargets() {
+        uploadTreatments(tempTargetsStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedTempTargets)
+    }
+
+    private func uploadTreatments(_ treatments: [NigtscoutTreatment], fileToSave: String) {
         guard !treatments.isEmpty, let nightscout = nightscoutAPI else {
             return
         }
@@ -124,12 +137,18 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
 
 extension BaseNightscoutManager: PumpHistoryObserver {
     func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) {
-        uploadPumpHistory(pumpHistoryStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedPumphistory)
+        uploadPumpHistory()
     }
 }
 
 extension BaseNightscoutManager: CarbsObserver {
     func carbsDidUpdate(_: [CarbsEntry]) {
-        uploadPumpHistory(carbsStorage.nightscoutTretmentsNotUploaded(), fileToSave: OpenAPS.Nightscout.uploadedCarbs)
+        uploadCarbs()
+    }
+}
+
+extension BaseNightscoutManager: TempTargetsObserver {
+    func tempTargetsDidUpdate(_: [TempTarget]) {
+        uploadTempTargets()
     }
 }