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

Merge branch 'core-data-sync-trio' of https://github.com/dnzxy/Open-iAPS into core-data-sync-trio

polscm32 1 год назад
Родитель
Сommit
a7d6f0ef8c

+ 24 - 4
FreeAPS/Sources/APS/CGM/PluginSource.swift

@@ -1,5 +1,7 @@
+import CGMBLEKit
 import Combine
 import Combine
 import Foundation
 import Foundation
+import G7SensorKit
 import LibreTransmitter
 import LibreTransmitter
 import LoopKit
 import LoopKit
 import LoopKitUI
 import LoopKitUI
@@ -162,11 +164,29 @@ extension PluginSource: CGMManagerDelegate {
         case let .newData(values):
         case let .newData(values):
 
 
             var sensorActivatedAt: Date?
             var sensorActivatedAt: Date?
+            var sensorStartDate: Date?
             var sensorTransmitterID: String?
             var sensorTransmitterID: String?
-            /// specific for Libre transmitter and send SAGE
+
+            /// SAGE
             if let cgmTransmitterManager = cgmManager as? LibreTransmitterManagerV3 {
             if let cgmTransmitterManager = cgmManager as? LibreTransmitterManagerV3 {
-                sensorActivatedAt = cgmTransmitterManager.sensorInfoObservable.activatedAt
-                sensorTransmitterID = cgmTransmitterManager.sensorInfoObservable.sensorSerial
+                let sensorInfo = cgmTransmitterManager.sensorInfoObservable
+                sensorActivatedAt = sensorInfo.activatedAt
+                sensorStartDate = sensorInfo.activatedAt
+                sensorTransmitterID = sensorInfo.sensorSerial
+            } else if let cgmTransmitterManager = cgmManager as? G5CGMManager {
+                let latestReading = cgmTransmitterManager.latestReading
+                sensorActivatedAt = latestReading?.activationDate
+                sensorStartDate = latestReading?.sessionStartDate
+                sensorTransmitterID = latestReading?.transmitterID
+            } else if let cgmTransmitterManager = cgmManager as? G6CGMManager {
+                let latestReading = cgmTransmitterManager.latestReading
+                sensorActivatedAt = latestReading?.activationDate
+                sensorStartDate = latestReading?.sessionStartDate
+                sensorTransmitterID = latestReading?.transmitterID
+            } else if let cgmTransmitterManager = cgmManager as? G7CGMManager {
+                sensorActivatedAt = cgmTransmitterManager.sensorActivatedAt
+                sensorStartDate = cgmTransmitterManager.sensorActivatedAt
+                sensorTransmitterID = cgmTransmitterManager.sensorName
             }
             }
 
 
             let bloodGlucose = values.compactMap { newGlucoseSample -> BloodGlucose? in
             let bloodGlucose = values.compactMap { newGlucoseSample -> BloodGlucose? in
@@ -185,7 +205,7 @@ extension PluginSource: CGMManagerDelegate {
                     glucose: value,
                     glucose: value,
                     type: "sgv",
                     type: "sgv",
                     activationDate: sensorActivatedAt,
                     activationDate: sensorActivatedAt,
-                    sessionStartDate: sensorActivatedAt,
+                    sessionStartDate: sensorStartDate,
                     transmitterID: sensorTransmitterID
                     transmitterID: sensorTransmitterID
                 )
                 )
             }
             }

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

@@ -367,7 +367,7 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
 
 
         if case .inProgress = status.bolusState {
         if case .inProgress = status.bolusState {
             bolusTrigger.send(true)
             bolusTrigger.send(true)
-        } else if status.bolusState != .canceling {
+        } else {
             bolusTrigger.send(false)
             bolusTrigger.send(false)
         }
         }
 
 

+ 4 - 4
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -67,13 +67,12 @@ extension DataTable {
         private var manualGlucoseFormatter: NumberFormatter {
         private var manualGlucoseFormatter: NumberFormatter {
             let formatter = NumberFormatter()
             let formatter = NumberFormatter()
             formatter.numberStyle = .decimal
             formatter.numberStyle = .decimal
+            formatter.maximumFractionDigits = 0
             if state.units == .mmolL {
             if state.units == .mmolL {
+                formatter.minimumFractionDigits = 0
                 formatter.maximumFractionDigits = 1
                 formatter.maximumFractionDigits = 1
-                formatter.minimumFractionDigits = 1
-                formatter.roundingMode = .ceiling
-            } else {
-                formatter.maximumFractionDigits = 0
             }
             }
+            formatter.roundingMode = .down
             return formatter
             return formatter
         }
         }
 
 
@@ -331,6 +330,7 @@ extension DataTable {
                                 TextFieldWithToolBar(
                                 TextFieldWithToolBar(
                                     text: $state.manualGlucose,
                                     text: $state.manualGlucose,
                                     placeholder: " ... ",
                                     placeholder: " ... ",
+                                    shouldBecomeFirstResponder: true,
                                     numberFormatter: manualGlucoseFormatter
                                     numberFormatter: manualGlucoseFormatter
                                 )
                                 )
                                 Text(state.units.rawValue).foregroundStyle(.secondary)
                                 Text(state.units.rawValue).foregroundStyle(.secondary)

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

@@ -52,6 +52,10 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
         settingsManager.settings.isUploadEnabled
         settingsManager.settings.isUploadEnabled
     }
     }
 
 
+    private var isDownloadEnabled: Bool {
+        settingsManager.settings.isDownloadEnabled
+    }
+
     private var isUploadGlucoseEnabled: Bool {
     private var isUploadGlucoseEnabled: Bool {
         settingsManager.settings.uploadGlucose
         settingsManager.settings.uploadGlucose
     }
     }
@@ -196,7 +200,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchCarbs() async -> [CarbsEntry] {
     func fetchCarbs() async -> [CarbsEntry] {
-        guard let nightscout = nightscoutAPI, isNetworkReachable else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable, isDownloadEnabled else {
             return []
             return []
         }
         }
 
 
@@ -211,7 +215,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchTempTargets() async -> [TempTarget] {
     func fetchTempTargets() async -> [TempTarget] {
-        guard let nightscout = nightscoutAPI, isNetworkReachable else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable, isDownloadEnabled else {
             return []
             return []
         }
         }
 
 
@@ -226,7 +230,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
     }
     }
 
 
     func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> {
     func fetchAnnouncements() -> AnyPublisher<[Announcement], Never> {
-        guard let nightscout = nightscoutAPI, isNetworkReachable else {
+        guard let nightscout = nightscoutAPI, isNetworkReachable, isDownloadEnabled else {
             return Just([]).eraseToAnyPublisher()
             return Just([]).eraseToAnyPublisher()
         }
         }
 
 

+ 26 - 13
FreeAPS/Sources/Views/TextFieldWithToolBar.swift

@@ -153,14 +153,23 @@ extension TextFieldWithToolBar.Coordinator: UITextFieldDelegate {
            let currentText = textField.text as NSString?
            let currentText = textField.text as NSString?
         {
         {
             // Get the proposed new text
             // Get the proposed new text
-            let proposedText = currentText.replacingCharacters(in: range, with: string)
+            let proposedTextOriginal = currentText.replacingCharacters(in: range, with: string)
+
+            // Remove thousand separator
+            let proposedText = proposedTextOriginal.replacingOccurrences(of: decimalFormatter.groupingSeparator, with: "")
 
 
             // Try to convert proposed text to number
             // Try to convert proposed text to number
             let number = parent.numberFormatter.number(from: proposedText) ?? decimalFormatter.number(from: proposedText)
             let number = parent.numberFormatter.number(from: proposedText) ?? decimalFormatter.number(from: proposedText)
 
 
             // Update the binding value if conversion is successful
             // Update the binding value if conversion is successful
             if let number = number {
             if let number = number {
-                parent.text = number.decimalValue
+                let lastCharIndex = proposedText.index(before: proposedText.endIndex)
+                let hasDecimalSeparator = proposedText.contains(decimalFormatter.decimalSeparator)
+                let hasTrailingZeros = (hasDecimalSeparator && proposedText[lastCharIndex] == "0") || isDecimalSeparator
+                if !hasTrailingZeros
+                {
+                    parent.text = number.decimalValue
+                }
             } else {
             } else {
                 parent.text = 0
                 parent.text = 0
             }
             }
@@ -290,20 +299,24 @@ extension TextFieldWithToolBarString.Coordinator: UITextFieldDelegate {
         shouldChangeCharactersIn range: NSRange,
         shouldChangeCharactersIn range: NSRange,
         replacementString string: String
         replacementString string: String
     ) -> Bool {
     ) -> Bool {
-        if let maxLength = parent.maxLength {
-            // Get the current text, including the proposed change
-            let currentText = textField.text ?? ""
-            let newLength = currentText.count + string.count - range.length
-            if newLength > maxLength {
-                return false
-            }
+        guard let currentText = textField.text as NSString? else {
+            return false
         }
         }
 
 
+        // Calculate the new text length
+        let newLength = currentText.length + string.count - range.length
+
+        // If there's a maxLength, ensure the new length is within the limit
+        if let maxLength = parent.maxLength, newLength > maxLength {
+            return false
+        }
+
+        // Attempt to replace characters in range with the replacement string
+        let newText = currentText.replacingCharacters(in: range, with: string)
+
+        // Update the binding text state
         DispatchQueue.main.async {
         DispatchQueue.main.async {
-            if let textFieldText = textField.text as NSString? {
-                let newText = textFieldText.replacingCharacters(in: range, with: string)
-                self.parent.text = newText
-            }
+            self.parent.text = newText
         }
         }
 
 
         return true
         return true

+ 1 - 1
LoopKit

@@ -1 +1 @@
-Subproject commit 2f535b3ca46825e82e0dd1b5ef9daccd53a3f0ca
+Subproject commit 6d9b19ab7e9f749d573fd42f6bcd2ce4c302cf66

+ 1 - 1
OmniBLE

@@ -1 +1 @@
-Subproject commit 85fc3c6d4805d580acdf6592b220717b6e842558
+Subproject commit 9bb11c714d68f4b915ac484122b4c104fb1c6d3c

+ 1 - 1
OmniKit

@@ -1 +1 @@
-Subproject commit a80e38b1b7f203014b461f8aff8cead2c067e39d
+Subproject commit f55c08045bf8b3af7b47eaafcc3181bcf5c04681