Bläddra i källkod

Testdata for alarms

Jonas Björkert 1 år sedan
förälder
incheckning
8c7783ba9c

+ 0 - 1
LoopFollow/Alarm/Alarm.swift

@@ -162,7 +162,6 @@ struct Alarm: Identifiable, Codable, Equatable {
         content.subtitle += Observable.shared.deltaText.value
         content.subtitle += Observable.shared.deltaText.value
         content.categoryIdentifier = "category"
         content.categoryIdentifier = "category"
             // This is needed to trigger vibrate on watch and phone
             // This is needed to trigger vibrate on watch and phone
-            // TODO:
             // See if we can use .Critcal
             // See if we can use .Critcal
             // See if we should use this method instead of direct sound player
             // See if we should use this method instead of direct sound player
         content.sound = .default
         content.sound = .default

+ 1 - 1
LoopFollow/Alarm/AlarmData.swift

@@ -8,7 +8,7 @@
 
 
 import Foundation
 import Foundation
 
 
-struct AlarmData {
+struct AlarmData : Encodable, Decodable{
 //    let bgReadings: [ShareGlucoseData]
 //    let bgReadings: [ShareGlucoseData]
 //    let iob: Double?
 //    let iob: Double?
 //    let cob: Double?
 //    let cob: Double?

+ 37 - 5
LoopFollow/Task/AlarmTask.swift

@@ -7,8 +7,7 @@
 //
 //
 
 
 import Foundation
 import Foundation
-//TODO: Nu körs ju alarm var 60 sekund... men man vill nog ha det direkt efter bg-värdet kommer in etc.
-//TODO: Men ändå kanske inte för nära ett tidigare alarm, men det kanske vi inte hanterar här....
+
 extension MainViewController {
 extension MainViewController {
     func scheduleAlarmTask(initialDelay: TimeInterval = 1) {
     func scheduleAlarmTask(initialDelay: TimeInterval = 1) {
         let firstRun = Date().addingTimeInterval(initialDelay)
         let firstRun = Date().addingTimeInterval(initialDelay)
@@ -20,12 +19,14 @@ extension MainViewController {
 
 
     func alarmTaskAction() {
     func alarmTaskAction() {
         DispatchQueue.main.async {
         DispatchQueue.main.async {
-            //TODO: Fyll på med mer alarmData
-            //TODO: gör det möjligt att köra med fejkad data.
-            let alarmData = AlarmData(
+            var alarmData = AlarmData(
                 expireDate: .distantPast // Storage.shared.expirationDate.value
                 expireDate: .distantPast // Storage.shared.expirationDate.value
             )
             )
 
 
+            self.saveLatestAlarmDataToFile(alarmData)
+
+            alarmData = self.loadTestAlarmData() ?? alarmData
+
             LogManager.shared.log(category: .alarm, message: "Checking alarms based on \(alarmData)", isDebug: true)
             LogManager.shared.log(category: .alarm, message: "Checking alarms based on \(alarmData)", isDebug: true)
 
 
             AlarmManager.shared.checkAlarms(data: alarmData)
             AlarmManager.shared.checkAlarms(data: alarmData)
@@ -33,4 +34,35 @@ extension MainViewController {
             TaskScheduler.shared.rescheduleTask(id: .alarmCheck, to: Date().addingTimeInterval(60))
             TaskScheduler.shared.rescheduleTask(id: .alarmCheck, to: Date().addingTimeInterval(60))
         }
         }
     }
     }
+
+    func saveLatestAlarmDataToFile(_ alarmData: AlarmData) {
+        let encoder = JSONEncoder()
+        encoder.dateEncodingStrategy = .iso8601
+        do {
+            let data = try encoder.encode(alarmData)
+            let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("latestAlarmData.json")
+            try data.write(to: url)
+        } catch {
+            LogManager.shared.log(category: .alarm, message: "Failed to save latest AlarmData: \(error)", isDebug: true)
+        }
+    }
+
+    func loadTestAlarmData() -> AlarmData? {
+        let fileManager = FileManager.default
+        let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("testAlarmData.json")
+
+        if fileManager.fileExists(atPath: url.path) {
+            do {
+                let data = try Data(contentsOf: url)
+                let decoder = JSONDecoder()
+                decoder.dateDecodingStrategy = .iso8601
+                let alarmData = try decoder.decode(AlarmData.self, from: data)
+                LogManager.shared.log(category: .alarm, message: "Loaded test AlarmData from \(url.path)", isDebug: true)
+                return alarmData
+            } catch {
+                LogManager.shared.log(category: .alarm, message: "Failed to load test AlarmData: \(error)", isDebug: true)
+            }
+        }
+        return nil
+    }
 }
 }

+ 3 - 0
LoopFollow/Task/TaskScheduler.swift

@@ -101,6 +101,9 @@ class TaskScheduler {
                 continue
                 continue
             }
             }
 
 
+            // Skip alarm checks if data-fetching tasks (deviceStatus, treatments, fetchBG) are currently due or just executed.
+            // This ensures alarms are evaluated with the latest data, avoiding premature or incorrect triggers.
+            // If skipped, reschedule alarmCheck 5 seconds later to retry after data updates.
             if taskID == .alarmCheck {
             if taskID == .alarmCheck {
                 let shouldSkip = tasksToSkipAlarmCheck.contains {
                 let shouldSkip = tasksToSkipAlarmCheck.contains {
                     guard let checkTask = tasks[$0] else { return false }
                     guard let checkTask = tasks[$0] else { return false }