AutotuneConfigStateModel.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. private(set) var units: GlucoseUnits = .mmolL
  10. @Published var publishedDate = Date()
  11. @Persisted(key: "lastAutotuneDate") private var lastAutotuneDate = Date() {
  12. didSet {
  13. DispatchQueue.main.async {
  14. self.publishedDate = self.lastAutotuneDate
  15. }
  16. }
  17. }
  18. override func subscribe() {
  19. autotune = provider.autotune
  20. units = settingsManager.settings.units
  21. useAutotune = settingsManager.settings.useAutotune
  22. publishedDate = lastAutotuneDate
  23. $useAutotune
  24. .removeDuplicates()
  25. .flatMap { [weak self] use -> AnyPublisher<Bool, Never> in
  26. guard let self = self else {
  27. return Just(false).eraseToAnyPublisher()
  28. }
  29. self.settingsManager.settings.useAutotune = use
  30. return self.apsManager.makeProfiles()
  31. }
  32. .cancellable()
  33. .store(in: &lifetime)
  34. }
  35. func run() {
  36. provider.runAutotune()
  37. .receive(on: DispatchQueue.main)
  38. .flatMap { [weak self] result -> AnyPublisher<Bool, Never> in
  39. guard let self = self else {
  40. return Just(false).eraseToAnyPublisher()
  41. }
  42. self.autotune = result
  43. return self.apsManager.makeProfiles()
  44. }
  45. .sink { [weak self] _ in
  46. self?.lastAutotuneDate = Date()
  47. }.store(in: &lifetime)
  48. }
  49. func delete() {
  50. provider.deleteAutotune()
  51. autotune = nil
  52. apsManager.makeProfiles()
  53. .cancellable()
  54. .store(in: &lifetime)
  55. }
  56. func copyBasal() {
  57. guard let autotuneProfile = autotune?.basalProfile else {
  58. NSLog("copyBasal failure - no profile")
  59. return
  60. }
  61. guard let pump = provider.deviceManager?.pumpManager else {
  62. // storage.save(profile, as: OpenAPS.Settings.basalProfile)
  63. NSLog("copyBasal failure - no pump")
  64. return
  65. }
  66. let profile = autotuneProfile.map {
  67. BasalProfileEntry(
  68. start: $0.start,
  69. minutes: $0.minutes,
  70. // Round to 0.05, ie. 1/20th
  71. rate: Decimal(round(Double($0.rate) * 20) / 20)
  72. )
  73. }
  74. for item in profile {
  75. NSLog("\(item.minutes) \(item.rate)")
  76. }
  77. let syncValues = profile.map {
  78. RepeatingScheduleValue(
  79. startTime: TimeInterval($0.minutes * 60),
  80. value: Double($0.rate)
  81. )
  82. }
  83. for item in syncValues {
  84. NSLog("\(item.startTime) \(item.value)")
  85. }
  86. pump.syncBasalRateSchedule(items: syncValues) { result in
  87. switch result {
  88. case .success:
  89. NSLog("copyBasal success")
  90. self.provider.storage.save(profile, as: OpenAPS.Settings.basalProfile)
  91. case let .failure(error):
  92. NSLog("copyBasal failed \(error)")
  93. }
  94. }
  95. }
  96. }
  97. }