Procházet zdrojové kódy

Release/0.1.10 (#19)


* Uploading data the day before

* Change communication alert to debug lavel

* Add insulin without actual bolusing

* resume/suspend in history

* Bump version
Ivan před 5 roky
rodič
revize
c1c1ef2e5c

+ 1 - 1
FreeAPS/Resources/Config.xcconfig

@@ -1 +1 @@
-BUILD_VERSION = 0.1.9
+BUILD_VERSION = 0.1.10

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

@@ -210,7 +210,7 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
     func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {}
 
     func pumpManager(_: PumpManager, didError error: PumpManagerError) {
-        info(.deviceManager, "error: \(error.localizedDescription)")
+        debug(.deviceManager, "error: \(error.localizedDescription)")
         pumpUpdateInProgress = false
     }
 
@@ -257,7 +257,7 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
     }
 
     func startDateToFilterNewPumpEvents(for _: PumpManager) -> Date {
-        lastEventDate ?? Date().addingTimeInterval(-2.hours.timeInterval)
+        lastEventDate?.addingTimeInterval(-15.minutes.timeInterval) ?? Date().addingTimeInterval(-2.hours.timeInterval)
     }
 }
 

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

@@ -41,12 +41,7 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
     }
 
     func syncDate() -> Date {
-        guard let events = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self),
-              let recent = events.filter({ !($0.enteredBy?.contains(CarbsEntry.manual) ?? false) }).first
-        else {
-            return Date().addingTimeInterval(-1.days.timeInterval)
-        }
-        return recent.createdAt
+        Date().addingTimeInterval(-1.days.timeInterval)
     }
 
     func recent() -> [CarbsEntry] {

+ 17 - 15
FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift

@@ -9,6 +9,7 @@ protocol PumpHistoryObserver {
 
 protocol PumpHistoryStorage {
     func storePumpEvents(_ events: [NewPumpEvent])
+    func storeEvents(_ events: [PumpHistoryEvent])
     func storeJournalCarbs(_ carbs: Int)
     func recent() -> [PumpHistoryEvent]
     func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
@@ -132,7 +133,7 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                 }
             }
 
-            self.processNewEvents(eventsToStore)
+            self.storeEvents(eventsToStore)
         }
     }
 
@@ -151,23 +152,24 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                     carbInput: carbs
                 )
             ]
-            self.processNewEvents(eventsToStore)
+            self.storeEvents(eventsToStore)
         }
     }
 
-    private func processNewEvents(_ events: [PumpHistoryEvent]) {
-        dispatchPrecondition(condition: .onQueue(processQueue))
-        let file = OpenAPS.Monitor.pumpHistory
-        var uniqEvents: [PumpHistoryEvent] = []
-        storage.transaction { storage in
-            storage.append(events, to: file, uniqBy: \.id)
-            uniqEvents = storage.retrieve(file, as: [PumpHistoryEvent].self)?
-                .filter { $0.timestamp.addingTimeInterval(1.days.timeInterval) > Date() }
-                .sorted { $0.timestamp > $1.timestamp } ?? []
-            storage.save(Array(uniqEvents), as: file)
-        }
-        broadcaster.notify(PumpHistoryObserver.self, on: processQueue) {
-            $0.pumpHistoryDidUpdate(uniqEvents)
+    func storeEvents(_ events: [PumpHistoryEvent]) {
+        processQueue.async {
+            let file = OpenAPS.Monitor.pumpHistory
+            var uniqEvents: [PumpHistoryEvent] = []
+            self.storage.transaction { storage in
+                storage.append(events, to: file, uniqBy: \.id)
+                uniqEvents = storage.retrieve(file, as: [PumpHistoryEvent].self)?
+                    .filter { $0.timestamp.addingTimeInterval(1.days.timeInterval) > Date() }
+                    .sorted { $0.timestamp > $1.timestamp } ?? []
+                storage.save(Array(uniqEvents), as: file)
+            }
+            self.broadcaster.notify(PumpHistoryObserver.self, on: self.processQueue) {
+                $0.pumpHistoryDidUpdate(uniqEvents)
+            }
         }
     }
 

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

@@ -50,12 +50,7 @@ final class BaseTempTargetsStorage: TempTargetsStorage, Injectable {
     }
 
     func syncDate() -> Date {
-        guard let events = storage.retrieve(OpenAPS.Settings.tempTargets, as: [TempTarget].self),
-              let recent = events.filter({ !($0.enteredBy?.contains(TempTarget.manual) ?? false) }).first
-        else {
-            return Date().addingTimeInterval(-1.days.timeInterval)
-        }
-        return recent.createdAt
+        Date().addingTimeInterval(-1.days.timeInterval)
     }
 
     func recent() -> [TempTarget] {

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

@@ -1,11 +1,19 @@
 import Foundation
 
-struct CarbsEntry: JSON, Equatable {
+struct CarbsEntry: JSON, Equatable, Hashable {
     let createdAt: Date
     let carbs: Decimal
     let enteredBy: String?
 
     static let manual = "freeaps-x"
+
+    static func == (lhs: CarbsEntry, rhs: CarbsEntry) -> Bool {
+        lhs.createdAt == rhs.createdAt
+    }
+
+    func hash(into hasher: inout Hasher) {
+        hasher.combine(createdAt)
+    }
 }
 
 extension CarbsEntry {

+ 9 - 1
FreeAPS/Sources/Models/TempTarget.swift

@@ -1,6 +1,6 @@
 import Foundation
 
-struct TempTarget: JSON, Identifiable, Equatable {
+struct TempTarget: JSON, Identifiable, Equatable, Hashable {
     var id = UUID().uuidString
     let name: String?
     var createdAt: Date
@@ -17,6 +17,14 @@ struct TempTarget: JSON, Identifiable, Equatable {
     var displayName: String {
         name ?? reason ?? TempTarget.custom
     }
+
+    static func == (lhs: TempTarget, rhs: TempTarget) -> Bool {
+        lhs.createdAt == rhs.createdAt
+    }
+
+    func hash(into hasher: inout Hasher) {
+        hasher.combine(createdAt)
+    }
 }
 
 extension TempTarget {

+ 29 - 0
FreeAPS/Sources/Modules/Bolus/BolusViewModel.swift

@@ -7,6 +7,7 @@ extension Bolus {
         @Injected() var apsManager: APSManager!
         @Injected() var broadcaster: Broadcaster!
         @Injected() var settingsManager: SettingsManager!
+        @Injected() var pumpHistotyStorage: PumpHistoryStorage!
         @Published var amount: Decimal = 0
         @Published var inslinRecommended: Decimal = 0
         @Published var inslinRequired: Decimal = 0
@@ -26,6 +27,10 @@ extension Bolus {
         override func subscribe() {
             setupInsulinRequired()
             broadcaster.register(SuggestionObserver.self, observer: self)
+
+            if waitForSuggestionInitial {
+                apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
+            }
         }
 
         func add() {
@@ -41,6 +46,30 @@ extension Bolus {
                 .store(in: &lifetime)
         }
 
+        func addWithoutBolus() {
+            guard amount > 0 else {
+                showModal(for: nil)
+                return
+            }
+
+            pumpHistotyStorage.storeEvents(
+                [
+                    PumpHistoryEvent(
+                        id: UUID().uuidString,
+                        type: .bolus,
+                        timestamp: Date(),
+                        amount: amount,
+                        duration: nil,
+                        durationMin: nil,
+                        rate: nil,
+                        temp: nil,
+                        carbInput: nil
+                    )
+                ]
+            )
+            showModal(for: nil)
+        }
+
         func setupInsulinRequired() {
             DispatchQueue.main.async {
                 self.inslinRequired = self.provider.suggestion?.insulinReq ?? 0

+ 3 - 0
FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift

@@ -63,6 +63,9 @@ extension Bolus {
                         if viewModel.waitForSuggestionInitial {
                             Button { viewModel.showModal(for: nil) }
                             label: { Text("Continue without bolus") }
+                        } else {
+                            Button { viewModel.addWithoutBolus() }
+                            label: { Text("Add insulin without actual bolusing") }
                         }
                     }
                 }

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

@@ -9,6 +9,8 @@ enum DataTable {
         case bolus
         case tempBasal
         case tempTarget
+        case suspend
+        case resume
 
         var name: String {
             switch self {
@@ -20,6 +22,10 @@ enum DataTable {
                 return "Temp Basal"
             case .tempTarget:
                 return "Temp Target"
+            case .suspend:
+                return "Suspend"
+            case .resume:
+                return "Resume"
             }
         }
     }
@@ -29,7 +35,7 @@ enum DataTable {
         let units: GlucoseUnits
         let type: DataType
         let date: Date
-        let amount: Decimal
+        let amount: Decimal?
         let secondAmount: Decimal?
         let duration: Decimal?
 
@@ -44,7 +50,7 @@ enum DataTable {
             units: GlucoseUnits,
             type: DataType,
             date: Date,
-            amount: Decimal,
+            amount: Decimal? = nil,
             secondAmount: Decimal? = nil,
             duration: Decimal? = nil
         ) {
@@ -65,6 +71,10 @@ enum DataTable {
         }
 
         var amountText: String {
+            guard let amount = amount else {
+                return ""
+            }
+
             switch type {
             case .carbs:
                 return numberFormater.string(from: amount as NSNumber)! + " g"
@@ -87,6 +97,9 @@ enum DataTable {
 
                 return numberFormater.string(from: converted as NSNumber)! + " - " + numberFormater
                     .string(from: secondAmount as NSNumber)! + " \(units.rawValue)"
+            case .resume,
+                 .suspend:
+                return type.name
             }
         }
 
@@ -98,7 +111,9 @@ enum DataTable {
                 return .insulin
             case .tempBasal:
                 return Color.insulin.opacity(0.5)
-            case .tempTarget:
+            case .resume,
+                 .suspend,
+                 .tempTarget:
                 return .loopGray
             }
         }

+ 14 - 2
FreeAPS/Sources/Modules/DataTable/DataTableViewModel.swift

@@ -25,7 +25,7 @@ extension DataTable {
                 let boluses = self.provider.pumpHistory()
                     .filter { $0.type == .bolus }
                     .map {
-                        Item(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount ?? 0)
+                        Item(units: units, type: .bolus, date: $0.timestamp, amount: $0.amount)
                     }
 
                 let tempBasals = self.provider.pumpHistory()
@@ -57,7 +57,19 @@ extension DataTable {
                         )
                     }
 
-                self.items = [carbs, boluses, tempBasals, tempTargets]
+                let suspend = self.provider.pumpHistory()
+                    .filter { $0.type == .pumpSuspend }
+                    .map {
+                        Item(units: units, type: .suspend, date: $0.timestamp)
+                    }
+
+                let resume = self.provider.pumpHistory()
+                    .filter { $0.type == .pumpResume }
+                    .map {
+                        Item(units: units, type: .resume, date: $0.timestamp)
+                    }
+
+                self.items = [carbs, boluses, tempBasals, tempTargets, suspend, resume]
                     .flatMap { $0 }
                     .sorted { $0.date > $1.date }
             }

+ 0 - 2
FreeAPS/Sources/Modules/Home/HomeViewModel.swift

@@ -277,12 +277,10 @@ extension Home.ViewModel:
 
     func tempTargetsDidUpdate(_: [TempTarget]) {
         setupTempTargets()
-        apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
     }
 
     func carbsDidUpdate(_: [CarbsEntry]) {
         setupCarbs()
-        apsManager.determineBasal().sink { _ in }.store(in: &lifetime)
     }
 
     func enactedSuggestionDidUpdate(_ suggestion: Suggestion) {

+ 1 - 1
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -214,7 +214,7 @@ struct MainChartView: View {
                 path.move(to: CGPoint(x: x, y: 0))
                 path.addLine(to: CGPoint(x: x, y: fullSize.height - 20))
             }
-            .stroke(Color.secondary, style: StrokeStyle(lineWidth: 0.2, dash: [5]))
+            .stroke(Color.secondary, style: StrokeStyle(lineWidth: 0.5, dash: [5]))
         }
     }