diff --git a/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift b/LoopFollow/Controllers/Nightscout/Treatments/Overrides.swift index 9fbaa2fa3..f7d4a7f36 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 } // skip short overrides - 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() }