AutotuneConfigStateModel.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import Combine
  2. import LoopKit
  3. import SwiftUI
  4. extension AutotuneConfig {
  5. final class StateModel: BaseStateModel<Provider> {
  6. @Injected() var apsManager: APSManager!
  7. @Injected() private var storage: FileStorage!
  8. @Published var useAutotune = false
  9. @Published var onlyAutotuneBasals = false
  10. @Published var autotune: Autotune?
  11. private(set) var units: GlucoseUnits = .mmolL
  12. @Published var publishedDate = Date()
  13. @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() {
  14. didSet {
  15. DispatchQueue.main.async {
  16. self.publishedDate = self.lastAutotuneDate
  17. }
  18. }
  19. }
  20. override func subscribe() {
  21. autotune = provider.autotune
  22. units = settingsManager.settings.units
  23. useAutotune = settingsManager.settings.useAutotune
  24. publishedDate = lastAutotuneDate
  25. subscribeSetting(\.onlyAutotuneBasals, on: $onlyAutotuneBasals) { onlyAutotuneBasals = $0 }
  26. $useAutotune
  27. .removeDuplicates()
  28. .flatMap { [weak self] use -> AnyPublisher<Bool, Never> in
  29. guard let self = self else {
  30. return Just(false).eraseToAnyPublisher()
  31. }
  32. self.settingsManager.settings.useAutotune = use
  33. return self.apsManager.makeProfiles()
  34. }
  35. .cancellable()
  36. .store(in: &lifetime)
  37. }
  38. func run() {
  39. provider.runAutotune()
  40. .receive(on: DispatchQueue.main)
  41. .flatMap { [weak self] result -> AnyPublisher<Bool, Never> in
  42. guard let self = self else {
  43. return Just(false).eraseToAnyPublisher()
  44. }
  45. self.autotune = result
  46. return self.apsManager.makeProfiles()
  47. }
  48. .sink { [weak self] _ in
  49. self?.lastAutotuneDate = Date()
  50. }.store(in: &lifetime)
  51. }
  52. func delete() {
  53. provider.deleteAutotune()
  54. autotune = nil
  55. apsManager.makeProfiles()
  56. .cancellable()
  57. .store(in: &lifetime)
  58. }
  59. func replace() {
  60. if let autotunedBasals = autotune {
  61. let basals = autotunedBasals.basalProfile
  62. .map { basal -> BasalProfileEntry in
  63. BasalProfileEntry(
  64. start: String(basal.start.prefix(5)),
  65. minutes: basal.minutes,
  66. rate: basal.rate
  67. )
  68. }
  69. guard let pump = apsManager.pumpManager else {
  70. storage.save(basals, as: OpenAPS.Settings.basalProfile)
  71. debug(.service, "Basals have been replaced with Autotuned Basals by user.")
  72. return
  73. }
  74. let syncValues = basals.map {
  75. RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate))
  76. }
  77. pump.syncBasalRateSchedule(items: syncValues) { result in
  78. switch result {
  79. case .success:
  80. self.storage.save(basals, as: OpenAPS.Settings.basalProfile)
  81. debug(.service, "Basals saved to pump!")
  82. case .failure:
  83. debug(.service, "Basals couldn't be save to pump")
  84. }
  85. }
  86. }
  87. }
  88. }
  89. }