TemporaryTarget.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //
  2. // TemporaryTarget.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2024-07-26.
  6. // Copyright © 2024 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. import HealthKit
  11. extension MainViewController {
  12. // NS Temporary Target Response Processor
  13. func processNSTemporaryTarget(entries: [[String: AnyObject]]) {
  14. overrideGraphData.removeAll()
  15. var activeTempTarget: Int? = nil
  16. entries.reversed().enumerated().forEach { (index, currentEntry) in
  17. print("\(currentEntry)")
  18. guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return }
  19. guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { return }
  20. var dateTimeStamp = parsedDate.timeIntervalSince1970
  21. let graphHours = 24 * UserDefaultsRepository.downloadDays.value
  22. if dateTimeStamp < dateTimeUtils.getTimeIntervalNHoursAgo(N: graphHours) {
  23. dateTimeStamp = dateTimeUtils.getTimeIntervalNHoursAgo(N: graphHours)
  24. }
  25. var duration: Double = 5.0
  26. duration = (currentEntry["duration"] as? Double ?? 5.0) * 60
  27. // If duration is 0, this marks the end of the last temp target
  28. if duration == 0 {
  29. // Check for an active temporary target
  30. if let activeIndex = overrideGraphData.lastIndex(where: { $0.endDate > dateTimeStamp }) {
  31. // Update the end date of the active temporary target
  32. overrideGraphData[activeIndex].endDate = dateTimeStamp
  33. activeTempTarget = nil
  34. }
  35. return
  36. }
  37. // Ignore very short durations
  38. if duration < 300 { return }
  39. guard let enteredBy = currentEntry["enteredBy"] as? String, let reason = currentEntry["reason"] as? String else { return }
  40. var range: [Int] = []
  41. let low = currentEntry["targetBottom"] as? Int
  42. let high = currentEntry["targetTop"] as? Int
  43. if (low == nil && high != nil) || (low != nil && high == nil) { return }
  44. range = [low ?? 0, high ?? 0]
  45. let endDate = dateTimeStamp + duration
  46. let dot = DataStructs.overrideStruct(insulNeedsScaleFactor: 1.0, date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: range, enteredBy: enteredBy, reason: reason, sgv: -20)
  47. overrideGraphData.append(dot)
  48. // Set activeTempTarget only if it is still active
  49. if Date().timeIntervalSince1970 < endDate {
  50. activeTempTarget = low
  51. }
  52. }
  53. if UserDefaultsRepository.graphOtherTreatments.value {
  54. updateOverrideGraph()
  55. }
  56. if let target = activeTempTarget {
  57. let unit = HKUnit.milligramsPerDeciliter
  58. let quantity = HKQuantity(unit: unit, doubleValue: Double(target))
  59. Observable.shared.tempTarget.value = quantity
  60. } else {
  61. Observable.shared.tempTarget.value = nil
  62. }
  63. let isActiveTempTarget = activeTempTarget != nil
  64. print("Is there an active temporary target? \(isActiveTempTarget)")
  65. }
  66. }