From 0c0d47180d80f5d3f833ab39b2656f0533f2500f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bj=C3=B6rkert?= Date: Mon, 19 May 2025 17:41:34 +0200 Subject: [PATCH 1/2] Fix for crashes related to overrides --- .../Nightscout/Treatments/Overrides.swift | 107 +++++++++--------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift b/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift index 9fbaa2fa3..596b46945 100644 --- a/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift +++ b/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift @@ -10,79 +10,80 @@ import Foundation import UIKit extension MainViewController { - // NS Override Response Processor - func processNSOverrides(entries: [[String:AnyObject]]) { + + func processNSOverrides(entries: [[String: AnyObject]]) { overrideGraphData.removeAll() - var activeOverrideNote: String? = nil + var activeOverrideNote: String? + + let sorted = entries.sorted { lhs, rhs in + guard + let ls = (lhs["timestamp"] as? String) ?? (lhs["created_at"] as? String), + let rs = (rhs["timestamp"] as? String) ?? (rhs["created_at"] as? String), + let ld = NightscoutUtils.parseDate(ls), + let rd = NightscoutUtils.parseDate(rs) + else { return false } + return ld < rd + } let now = Date().timeIntervalSince1970 - let predictionLoadHours = UserDefaultsRepository.predictionToLoad.value - let predictionLoadSeconds = predictionLoadHours * 3600 - let maxEndDate = now + predictionLoadSeconds + let maxEndDate = now + UserDefaultsRepository.predictionToLoad.value * 3600 + let graphHorizon = dateTimeUtils.getTimeIntervalNHoursAgo(N: 24 * UserDefaultsRepository.downloadDays.value) - entries.reversed().enumerated().forEach { (index, currentEntry) in - guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return } - guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { return } + for i in 0.. maxEndDate { - endDate = maxEndDate - duration = endDate - dateTimeStamp - } + end = min(end, maxEndDate) - if dateTimeStamp <= now && now < endDate { - activeOverrideNote = currentEntry["notes"] as? String ?? currentEntry["reason"] as? String - } + if end - start < 300 { continue } - let dot = DataStructs.overrideStruct(insulNeedsScaleFactor: multiplier, date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: range, enteredBy: enteredBy, reason: reason, sgv: -20) + let dot = DataStructs.overrideStruct( + insulNeedsScaleFactor: e["insulinNeedsScaleFactor"] as? Double ?? 1, + date: start, + endDate: end, + duration: end - start, + correctionRange: { + if let r = e["correctionRange"] as? [Int], r.count == 2 { + return r + } + let lo = e["targetBottom"] as? Int ?? 0 + let hi = e["targetTop"] as? Int ?? 0 + return [lo, hi] + }(), + enteredBy: e["enteredBy"] as? String ?? "unknown", + reason: e["reason"] as? String ?? "", + sgv: -20 + ) overrideGraphData.append(dot) + + if now >= start, now < end { + activeOverrideNote = e["notes"] as? String ?? e["reason"] as? String + } } - - Observable.shared.override.value = activeOverrideNote + Observable.shared.override.value = activeOverrideNote if ObservableUserDefaults.shared.device.value == "Trio" { - if let note = activeOverrideNote - { + if let note = activeOverrideNote { infoManager.updateInfoData(type: .override, value: note) } else { infoManager.clearInfoData(type: .override) } } - if UserDefaultsRepository.graphOtherTreatments.value { updateOverrideGraph() } From cdc9684a456d2e8fd6162dd630e88fdb95e40996 Mon Sep 17 00:00:00 2001 From: marionbarker Date: Mon, 19 May 2025 13:40:16 -0700 Subject: [PATCH 2/2] modify artificial gap to 1 minute for overlapping overrides, add comments --- LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift b/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift index 596b46945..f7d4a7f36 100644 --- a/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift +++ b/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift @@ -45,12 +45,12 @@ extension MainViewController { let nextStart = NightscoutUtils.parseDate(nextDateStr)? .timeIntervalSince1970 { - end = min(end, nextStart - 300) + end = min(end, nextStart - 60) // avoid overlapping overrides } end = min(end, maxEndDate) - if end - start < 300 { continue } + if end - start < 300 { continue } // skip short overrides let dot = DataStructs.overrideStruct( insulNeedsScaleFactor: e["insulinNeedsScaleFactor"] as? Double ?? 1,