Преглед на файлове

Merge remote-tracking branch 'ivalkou/dev' into Crowdin

Jon B.M преди 4 години
родител
ревизия
bb016f9b98

+ 0 - 168
FreeAPS.xcodeproj/xcuserdata/i.valkou.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>SchemeUserState</key>
-	<dict>
-		<key>AnyCodable (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>22</integer>
-		</dict>
-		<key>AnyCodable (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>23</integer>
-		</dict>
-		<key>AnyCodable (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>18</integer>
-		</dict>
-		<key>FreeAPS X.xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>0</integer>
-		</dict>
-		<key>FreeAPSWatch (Complication).xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>11</integer>
-		</dict>
-		<key>FreeAPSWatch (Notification).xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>12</integer>
-		</dict>
-		<key>FreeAPSWatch.xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>10</integer>
-		</dict>
-		<key>ReactiveSwift (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>8</integer>
-		</dict>
-		<key>ReactiveSwift (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>9</integer>
-		</dict>
-		<key>ReactiveSwift (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>7</integer>
-		</dict>
-		<key>ReactiveSwift-UIExamples (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>5</integer>
-		</dict>
-		<key>ReactiveSwift-UIExamples (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>6</integer>
-		</dict>
-		<key>ReactiveSwift-UIExamples (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>4</integer>
-		</dict>
-		<key>Rx (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>11</integer>
-		</dict>
-		<key>Rx (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>12</integer>
-		</dict>
-		<key>Rx (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>10</integer>
-		</dict>
-		<key>Sample-iOS (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>17</integer>
-		</dict>
-		<key>Sample-iOS (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>18</integer>
-		</dict>
-		<key>Sample-iOS (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>16</integer>
-		</dict>
-		<key>SwiftDate (Playground) 1.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>19</integer>
-		</dict>
-		<key>SwiftDate (Playground) 2.xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>20</integer>
-		</dict>
-		<key>SwiftDate (Playground).xcscheme</key>
-		<dict>
-			<key>isShown</key>
-			<false/>
-			<key>orderHint</key>
-			<integer>15</integer>
-		</dict>
-	</dict>
-	<key>SuppressBuildableAutocreation</key>
-	<dict>
-		<key>388E595725AD948C0019842D</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>38FCF3EC25E9028E0078B0D1</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-	</dict>
-</dict>
-</plist>

+ 4 - 1
FreeAPS/Sources/APS/APSManager.swift

@@ -288,7 +288,7 @@ final class BaseAPSManager: APSManager, Injectable {
     func roundBolus(amount: Decimal) -> Decimal {
         guard let pump = pumpManager else { return amount }
         let rounded = Decimal(pump.roundToSupportedBolusVolume(units: Double(amount)))
-        let maxBolus = Decimal(pump.roundToSupportedBolusVolume(units: Double(settingsManager.pumpSettings.maxBolus))) 
+        let maxBolus = Decimal(pump.roundToSupportedBolusVolume(units: Double(settingsManager.pumpSettings.maxBolus)))
         return min(rounded, maxBolus)
     }
 
@@ -345,6 +345,9 @@ final class BaseAPSManager: APSManager, Injectable {
                 debug(.apsManager, "Temp Basal succeeded")
                 let temp = TempBasal(duration: Int(duration / 60), rate: Decimal(rate), temp: .absolute, timestamp: Date())
                 self.storage.save(temp, as: OpenAPS.Monitor.tempBasal)
+                if rate == 0, duration == 0 {
+                    self.pumpHistoryStorage.saveCancelTempEvents()
+                }
             case let .failure(error):
                 debug(.apsManager, "Temp Basal failed with error: \(error.localizedDescription)")
                 self.processError(APSError.pumpError(error))

+ 6 - 0
FreeAPS/Sources/APS/CGM/AppGroupSource.swift

@@ -2,6 +2,8 @@ import Combine
 import Foundation
 
 struct AppGroupSource: GlucoseSource {
+    let from: String
+
     func fetch() -> AnyPublisher<[BloodGlucose], Never> {
         guard let suiteName = Bundle.main.appGroupSuiteName,
               let sharedDefaults = UserDefaults(suiteName: suiteName)
@@ -31,6 +33,10 @@ struct AppGroupSource: GlucoseSource {
                 let date = parseDate(timestamp)
             else { continue }
 
+            if let from = sgv["from"] as? String {
+                guard from == self.from else { continue }
+            }
+
             results.append(
                 BloodGlucose(
                     sgv: glucose,

+ 2 - 3
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -18,7 +18,6 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     private var lifetime = Lifetime()
     private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
 
-    private lazy var appGroupSource = AppGroupSource()
     private lazy var dexcomSource = DexcomSource()
     private lazy var simulatorSource = GlucoseSimulatorSource()
 
@@ -33,7 +32,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     private func updateGlucoseSource() {
         switch settingsManager.settings.cgm {
         case .xdrip:
-            glucoseSource = appGroupSource
+            glucoseSource = AppGroupSource(from: "xDrip")
         case .dexcomG5,
              .dexcomG6:
             glucoseSource = dexcomSource
@@ -44,7 +43,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         case .libreTransmitter:
             glucoseSource = libreTransmitter
         case .glucoseDirect:
-            glucoseSource = appGroupSource
+            glucoseSource = AppGroupSource(from: "GlucoseDirect")
         case .enlite:
             glucoseSource = deviceDataManager
         }

+ 49 - 8
FreeAPS/Sources/APS/Storage/PumpHistoryStorage.swift

@@ -13,6 +13,7 @@ protocol PumpHistoryStorage {
     func storeJournalCarbs(_ carbs: Int)
     func recent() -> [PumpHistoryEvent]
     func nightscoutTretmentsNotUploaded() -> [NigtscoutTreatment]
+    func saveCancelTempEvents()
 }
 
 final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
@@ -45,26 +46,34 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
                         carbInput: nil
                     )]
                 case .tempBasal:
-                    // get only start of TBR
-                    guard let dose = event.dose, dose.deliveredUnits ?? 0 == 0 else { return [] }
+                    guard let dose = event.dose else { return [] }
+
                     let rate = Decimal(string: dose.unitsPerHour.description)
-                    let minutes = Int((dose.endDate - dose.startDate).timeInterval / 60)
+                    let minutes = (dose.endDate - dose.startDate).timeInterval / 60
+                    let delivered = dose.deliveredUnits
+                    let date = event.date
+
+                    let isCancel = !event.isMutable && delivered != nil
+                    guard !isCancel else { return [] }
+
+                    let basalID = UUID().uuidString
+
                     return [
                         PumpHistoryEvent(
-                            id: id,
+                            id: basalID,
                             type: .tempBasalDuration,
-                            timestamp: event.date,
+                            timestamp: date,
                             amount: nil,
                             duration: nil,
-                            durationMin: minutes,
+                            durationMin: Int(round(minutes)),
                             rate: nil,
                             temp: nil,
                             carbInput: nil
                         ),
                         PumpHistoryEvent(
-                            id: "_" + id,
+                            id: "_" + basalID,
                             type: .tempBasal,
-                            timestamp: event.date,
+                            timestamp: date,
                             amount: nil,
                             duration: nil,
                             durationMin: nil,
@@ -259,4 +268,36 @@ final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
 
         return treatments.sorted { $0.createdAt! > $1.createdAt! }
     }
+
+    func saveCancelTempEvents() {
+        let basalID = UUID().uuidString
+        let date = Date()
+
+        let events = [
+            PumpHistoryEvent(
+                id: basalID,
+                type: .tempBasalDuration,
+                timestamp: date,
+                amount: nil,
+                duration: nil,
+                durationMin: 0,
+                rate: nil,
+                temp: nil,
+                carbInput: nil
+            ),
+            PumpHistoryEvent(
+                id: "_" + basalID,
+                type: .tempBasal,
+                timestamp: date,
+                amount: nil,
+                duration: nil,
+                durationMin: nil,
+                rate: 0,
+                temp: .absolute,
+                carbInput: nil
+            )
+        ]
+
+        storeEvents(events)
+    }
 }

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

@@ -10,7 +10,7 @@ struct IOBEntry: JSON {
     let iobWithZeroTemp: WithZeroTemp?
     let lastBolusTime: UInt64?
     let lastTemp: LastTemp?
-    var timestamp: Date?
+    var time: Date?
 
     struct WithZeroTemp: JSON {
         let iob: Decimal

+ 5 - 1
FreeAPS/Sources/Modules/DataTable/DataTableDataFlow.swift

@@ -75,6 +75,10 @@ enum DataTable {
                 return ""
             }
 
+            if amount == 0, duration == 0 {
+                return "Cancel temp"
+            }
+
             switch type {
             case .carbs:
                 return numberFormater.string(from: amount as NSNumber)! + NSLocalizedString(" g", comment: "gram of carbs")
@@ -120,7 +124,7 @@ enum DataTable {
         }
 
         var durationText: String? {
-            guard let duration = duration else {
+            guard let duration = duration, duration > 0 else {
                 return nil
             }
             return numberFormater.string(from: duration as NSNumber)! + " min"

+ 2 - 0
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -90,6 +90,8 @@ extension Settings {
                                 .navigationLink(to: .configEditor(file: OpenAPS.FreeAPS.tempTargetsPresets), from: self)
                             Text("Calibrations")
                                 .navigationLink(to: .configEditor(file: OpenAPS.FreeAPS.calibrations), from: self)
+                            Text("Current Temp")
+                                .navigationLink(to: .configEditor(file: OpenAPS.Monitor.tempBasal), from: self)
                             Text("Middleware")
                                 .navigationLink(to: .configEditor(file: OpenAPS.Middleware.determineBasal), from: self)
                             Text("Edit settings json")