TemporaryTarget.swift 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // LoopFollow
  2. // TemporaryTarget.swift
  3. // Created by Jonas Björkert.
  4. import Foundation
  5. import HealthKit
  6. import UIKit
  7. extension MainViewController {
  8. // NS Temporary Target Response Processor
  9. func processNSTemporaryTarget(entries: [[String: AnyObject]]) {
  10. tempTargetGraphData.removeAll()
  11. var activeTempTarget: Int?
  12. for (index, currentEntry) in entries.reversed().enumerated() {
  13. guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { continue }
  14. guard let parsedDate = NightscoutUtils.parseDate(dateStr) else { continue }
  15. var dateTimeStamp = parsedDate.timeIntervalSince1970
  16. let graphHours = 24 * Storage.shared.downloadDays.value
  17. if dateTimeStamp < dateTimeUtils.getTimeIntervalNHoursAgo(N: graphHours) {
  18. dateTimeStamp = dateTimeUtils.getTimeIntervalNHoursAgo(N: graphHours)
  19. }
  20. let duration: Double = (currentEntry["duration"] as? Double ?? 5.0) * 60
  21. // If duration is 0, this marks the end of the last temp target
  22. if duration == 0 {
  23. if let activeIndex = tempTargetGraphData.lastIndex(where: { $0.endDate > dateTimeStamp }) {
  24. tempTargetGraphData[activeIndex].endDate = dateTimeStamp
  25. activeTempTarget = nil
  26. }
  27. continue
  28. }
  29. if duration < 300 {
  30. continue
  31. }
  32. let reason = currentEntry["reason"] as? String ?? ""
  33. guard let enteredBy = currentEntry["enteredBy"] as? String else {
  34. continue
  35. }
  36. let low = currentEntry["targetBottom"] as? Double
  37. let high = currentEntry["targetTop"] as? Double
  38. let targetValue = low ?? high
  39. if targetValue == nil {
  40. continue
  41. }
  42. let endDate = dateTimeStamp + duration
  43. let dot = DataStructs.tempTargetStruct(date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: [Int(targetValue!)], enteredBy: enteredBy, reason: reason)
  44. tempTargetGraphData.append(dot)
  45. // Set activeTempTarget only if it is still active
  46. let currentTime = Date().timeIntervalSince1970
  47. if currentTime < endDate {
  48. activeTempTarget = Int(targetValue!)
  49. }
  50. }
  51. if Storage.shared.graphOtherTreatments.value {
  52. updateTempTargetGraph()
  53. updateChartRenderers()
  54. }
  55. if let target = activeTempTarget {
  56. let unit = HKUnit.milligramsPerDeciliter
  57. let quantity = HKQuantity(unit: unit, doubleValue: Double(target))
  58. Observable.shared.tempTarget.value = quantity
  59. } else {
  60. Observable.shared.tempTarget.value = nil
  61. }
  62. }
  63. }