فهرست منبع

Detection of temp target and result handling

Jonas Björkert 2 سال پیش
والد
کامیت
178a511842

+ 18 - 19
LoopFollow/Controllers/Nightscout/Treatments/TemporaryTarget.swift

@@ -17,7 +17,6 @@ extension MainViewController {
         var activeTempTarget: Int? = nil
 
         entries.reversed().enumerated().forEach { (index, currentEntry) in
-            print("\(currentEntry)")
             guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return }
             guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { return }
 
@@ -27,39 +26,42 @@ extension MainViewController {
                 dateTimeStamp = dateTimeUtils.getTimeIntervalNHoursAgo(N: graphHours)
             }
 
-            var duration: Double = 5.0
-            duration = (currentEntry["duration"] as? Double ?? 5.0) * 60
+            var duration: Double = (currentEntry["duration"] as? Double ?? 5.0) * 60
 
             // If duration is 0, this marks the end of the last temp target
             if duration == 0 {
-                // Check for an active temporary target
                 if let activeIndex = overrideGraphData.lastIndex(where: { $0.endDate > dateTimeStamp }) {
-                    // Update the end date of the active temporary target
                     overrideGraphData[activeIndex].endDate = dateTimeStamp
                     activeTempTarget = nil
                 }
                 return
             }
 
-            // Ignore very short durations
-            if duration < 300 { return }
+            if duration < 300 {
+                return
+            }
+
+            guard let enteredBy = currentEntry["enteredBy"] as? String, let reason = currentEntry["reason"] as? String else {
+                return
+            }
 
-            guard let enteredBy = currentEntry["enteredBy"] as? String, let reason = currentEntry["reason"] as? String else { return }
+            let low = currentEntry["targetBottom"] as? Double
+            let high = currentEntry["targetTop"] as? Double
+            let targetValue = low ?? high
 
-            var range: [Int] = []
-            let low = currentEntry["targetBottom"] as? Int
-            let high = currentEntry["targetTop"] as? Int
-            if (low == nil && high != nil) || (low != nil && high == nil) { return }
-            range = [low ?? 0, high ?? 0]
+            if targetValue == nil {
+                return
+            }
 
             let endDate = dateTimeStamp + duration
 
-            let dot = DataStructs.overrideStruct(insulNeedsScaleFactor: 1.0, date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: range, enteredBy: enteredBy, reason: reason, sgv: -20)
+            let dot = DataStructs.overrideStruct(insulNeedsScaleFactor: 1.0, date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: [Int(targetValue!)], enteredBy: enteredBy, reason: reason, sgv: -20)
             overrideGraphData.append(dot)
 
             // Set activeTempTarget only if it is still active
-            if Date().timeIntervalSince1970 < endDate {
-                activeTempTarget = low
+            let currentTime = Date().timeIntervalSince1970
+            if currentTime < endDate {
+                activeTempTarget = Int(targetValue!)
             }
         }
 
@@ -74,8 +76,5 @@ extension MainViewController {
         } else {
             Observable.shared.tempTarget.value = nil
         }
-
-        let isActiveTempTarget = activeTempTarget != nil
-        print("Is there an active temporary target? \(isActiveTempTarget)")
     }
 }

+ 33 - 11
LoopFollow/Remote/RemoteView.swift

@@ -20,10 +20,11 @@ struct RemoteView: View {
     @State private var duration = HKQuantity(unit: .minute(), doubleValue: 0.0)
     @State private var showConfirmation: Bool = false
     @State private var showCheckmark: Bool = false
+    @State private var isLoading: Bool = false
 
     var onRefreshStatus: () -> Void
     var onCancelExistingTarget: () -> Void
-    var sendTempTarget: (HKQuantity, HKQuantity) -> Void
+    var sendTempTarget: (HKQuantity, HKQuantity, @escaping (Bool) -> Void) -> Void
 
     var body: some View {
         NavigationView {
@@ -71,21 +72,21 @@ struct RemoteView: View {
                             HStack {
                                 Button {
                                     showConfirmation = true
+                                } label: {
+                                    Text("Enact")
                                 }
-                            label: { Text("Enact") }
-                                    .disabled(isButtonDisabled)
-                                    .buttonStyle(BorderlessButtonStyle())
-                                    .font(.callout)
-                                    .controlSize(.mini)
+                                .disabled(isButtonDisabled)
+                                .buttonStyle(BorderlessButtonStyle())
+                                .font(.callout)
+                                .controlSize(.mini)
                             }
                         }
-
                         .alert(isPresented: $showConfirmation) {
                             Alert(
                                 title: Text("Confirm Command"),
                                 message: Text("New Target: \(Localizer.formatQuantity(newHKTarget)) \(UserDefaultsRepository.getPreferredUnit().localizedShortUnitString)\nDuration: \(Int(duration.doubleValue(for: HKUnit.minute()))) minutes"),
                                 primaryButton: .default(Text("Confirm"), action: {
-                                    sendTempTarget(newHKTarget , duration)
+                                    enactTempTarget()
                                 }),
                                 secondaryButton: .cancel()
                             )
@@ -95,10 +96,10 @@ struct RemoteView: View {
                         Image(systemName: "arrow.clockwise")
                     })
                     .padding()
+                    .disabled(isLoading) // Disable the form when loading
 
-                    if !statusMessage.value.isEmpty {
-                        Text(statusMessage.value)
-                            .foregroundColor(.green)
+                    if isLoading {
+                        ProgressView("Please wait...")
                             .padding()
                     }
                 }
@@ -106,6 +107,15 @@ struct RemoteView: View {
             .padding()
             .navigationTitle("Remote")
             .navigationBarTitleDisplayMode(.inline)
+            .alert(isPresented: .constant(!statusMessage.value.isEmpty)) {
+                Alert(
+                    title: Text("Status"),
+                    message: Text(statusMessage.value),
+                    dismissButton: .default(Text("OK"), action: {
+                        statusMessage.value = ""
+                    })
+                )
+            }
         }
     }
 
@@ -113,6 +123,18 @@ struct RemoteView: View {
         return newHKTarget.doubleValue(for: UserDefaultsRepository.getPreferredUnit()) == 0 ||
         duration.doubleValue(for: HKUnit.minute()) == 0
     }
+
+    private func enactTempTarget() {
+        isLoading = true
+        sendTempTarget(newHKTarget, duration) { success in
+            isLoading = false
+            if success {
+                statusMessage.value = "Target successfully enacted."
+            } else {
+                statusMessage.value = "Failed to enact target."
+            }
+        }
+    }
 }
 
 struct ErrorMessageView: View {

+ 3 - 1
LoopFollow/Remote/RemoteViewController.swift

@@ -55,7 +55,7 @@ class RemoteViewController: UIViewController {
         // Cancel the existing temp target
     }
 
-    private func sendTempTarget(newTarget: HKQuantity, duration: HKQuantity) {
+    private func sendTempTarget(newTarget: HKQuantity, duration: HKQuantity, completion: @escaping (Bool) -> Void) {
         let tempTargetBody: [String: Any] = [
             "enteredBy": "LoopFollow",
             "eventType": "Temporary Target",
@@ -72,11 +72,13 @@ class RemoteViewController: UIViewController {
                 print("Success: \(response)")
                 DispatchQueue.main.async {
                     self.statusMessage.set("Temp target sent successfully.")
+                    completion(true)
                 }
             case .failure(let error):
                 print("Error: \(error)")
                 DispatchQueue.main.async {
                     self.statusMessage.set("Failed to send temp target: \(error.localizedDescription)")
+                    completion(false)
                 }
             }
         }