PodDoseProgressEstimator.swift 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. //
  2. // PodDoseProgressEstimator.swift
  3. // OmniKit
  4. //
  5. // Created by Pete Schwamb on 3/12/19.
  6. // Copyright © 2019 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. import LoopKit
  10. class PodDoseProgressEstimator: DoseProgressTimerEstimator {
  11. let dose: DoseEntry
  12. weak var pumpManager: PumpManager?
  13. override var progress: DoseProgress {
  14. let elapsed = -dose.startDate.timeIntervalSinceNow
  15. let duration = dose.endDate.timeIntervalSince(dose.startDate)
  16. let percentComplete = min(elapsed / duration, 1)
  17. let delivered = pumpManager?.roundToSupportedBolusVolume(units: percentComplete * dose.programmedUnits) ?? dose.programmedUnits
  18. return DoseProgress(deliveredUnits: delivered, percentComplete: percentComplete)
  19. }
  20. init(dose: DoseEntry, pumpManager: PumpManager, reportingQueue: DispatchQueue) {
  21. self.dose = dose
  22. self.pumpManager = pumpManager
  23. super.init(reportingQueue: reportingQueue)
  24. }
  25. override func timerParameters() -> (delay: TimeInterval, repeating: TimeInterval) {
  26. let timeSinceStart = dose.startDate.timeIntervalSinceNow
  27. let timeBetweenPulses: TimeInterval
  28. switch dose.type {
  29. case .bolus:
  30. timeBetweenPulses = Pod.pulseSize / Pod.bolusDeliveryRate
  31. case .basal, .tempBasal:
  32. timeBetweenPulses = Pod.pulseSize / (dose.unitsPerHour / TimeInterval(hours: 1))
  33. default:
  34. fatalError("Can only estimate progress on basal rates or boluses.")
  35. }
  36. let delayUntilNextPulse = timeBetweenPulses - timeSinceStart.remainder(dividingBy: timeBetweenPulses)
  37. return (delay: delayUntilNextPulse, repeating: timeBetweenPulses)
  38. }
  39. }