AutotuneConfigStateModel.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import Combine
  2. import LoopKit
  3. import SwiftUI
  4. extension AutotuneConfig {
  5. final class StateModel: BaseStateModel<Provider> {
  6. @Injected() var apsManager: APSManager!
  7. @Published var useAutotune = false
  8. @Published var autotune: Autotune?
  9. @Published var basalProfile: [BasalProfileEntry?] = []
  10. private(set) var units: GlucoseUnits = .mmolL
  11. @Published var publishedDate = Date()
  12. @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() {
  13. didSet {
  14. DispatchQueue.main.async {
  15. self.publishedDate = self.lastAutotuneDate
  16. }
  17. }
  18. }
  19. override func subscribe() {
  20. autotune = provider.autotune
  21. var bp: [BasalProfileEntry?] = []
  22. for p in provider.autotune?.basalProfile ?? [] {
  23. var np: BasalProfileEntry?
  24. for b in provider.basalProfilePump {
  25. if b.start > p.start {
  26. NSLog("Matched \(p) with \(b)")
  27. break
  28. }
  29. np = b
  30. }
  31. bp.append(np)
  32. }
  33. NSLog("basalProfile \(bp)")
  34. basalProfile = bp
  35. units = settingsManager.settings.units
  36. useAutotune = settingsManager.settings.useAutotune
  37. publishedDate = lastAutotuneDate
  38. $useAutotune
  39. .removeDuplicates()
  40. .flatMap { [weak self] use -> AnyPublisher<Bool, Never> in
  41. guard let self = self else {
  42. return Just(false).eraseToAnyPublisher()
  43. }
  44. self.settingsManager.settings.useAutotune = use
  45. return self.apsManager.makeProfiles()
  46. }
  47. .cancellable()
  48. .store(in: &lifetime)
  49. }
  50. func run() {
  51. provider.runAutotune()
  52. .receive(on: DispatchQueue.main)
  53. .flatMap { [weak self] result -> AnyPublisher<Bool, Never> in
  54. guard let self = self else {
  55. return Just(false).eraseToAnyPublisher()
  56. }
  57. self.autotune = result
  58. return self.apsManager.makeProfiles()
  59. }
  60. .sink { [weak self] _ in
  61. self?.lastAutotuneDate = Date()
  62. }.store(in: &lifetime)
  63. }
  64. func delete() {
  65. provider.deleteAutotune()
  66. autotune = nil
  67. apsManager.makeProfiles()
  68. .cancellable()
  69. .store(in: &lifetime)
  70. }
  71. func copyBasal() {
  72. guard let autotuneProfile = autotune?.basalProfile else {
  73. NSLog("copyBasal failure - no profile")
  74. return
  75. }
  76. guard let pump = provider.deviceManager?.pumpManager else {
  77. // storage.save(profile, as: OpenAPS.Settings.basalProfile)
  78. NSLog("copyBasal failure - no pump")
  79. return
  80. }
  81. let profile = autotuneProfile.map {
  82. BasalProfileEntry(
  83. start: $0.start,
  84. minutes: $0.minutes,
  85. // Round to 0.05, ie. 1/20th
  86. rate: Decimal(round(Double($0.rate) * 20) / 20)
  87. )
  88. }
  89. for item in profile {
  90. NSLog("\(item.minutes) \(item.rate)")
  91. }
  92. let syncValues = profile.map {
  93. RepeatingScheduleValue(
  94. startTime: TimeInterval($0.minutes * 60),
  95. value: Double($0.rate)
  96. )
  97. }
  98. for item in syncValues {
  99. NSLog("\(item.startTime) \(item.value)")
  100. }
  101. pump.syncBasalRateSchedule(items: syncValues) { result in
  102. switch result {
  103. case .success:
  104. NSLog("copyBasal success")
  105. self.provider.storage.save(profile, as: OpenAPS.Settings.basalProfile)
  106. case let .failure(error):
  107. NSLog("copyBasal failed \(error)")
  108. }
  109. }
  110. }
  111. }
  112. }