BasalProfileEditorProvider.swift 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import Combine
  2. import Foundation
  3. import LoopKit
  4. extension BasalProfileEditor {
  5. final class Provider: BaseProvider, BasalProfileEditorProvider {
  6. private let processQueue = DispatchQueue(label: "BasalProfileEditorProvider.processQueue")
  7. var profile: [BasalProfileEntry] {
  8. storage.retrieve(OpenAPS.Settings.basalProfile, as: [BasalProfileEntry].self)
  9. ?? [BasalProfileEntry](from: OpenAPS.defaults(for: OpenAPS.Settings.basalProfile))
  10. ?? []
  11. }
  12. var autotune: Autotune? {
  13. storage.retrieve(OpenAPS.Settings.autotune, as: Autotune.self)
  14. }
  15. var supportedBasalRates: [Decimal]? {
  16. deviceManager.pumpManager?.supportedBasalRates.map { Decimal($0) }
  17. }
  18. func saveProfile(_ profile: [BasalProfileEntry]) -> AnyPublisher<Void, Error> {
  19. guard let pump = deviceManager?.pumpManager else {
  20. storage.save(profile, as: OpenAPS.Settings.basalProfile)
  21. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  22. }
  23. let syncValues = profile.map {
  24. RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate))
  25. }
  26. return Future { promise in
  27. pump.syncBasalRateSchedule(items: syncValues) { result in
  28. switch result {
  29. case .success:
  30. self.storage.save(profile, as: OpenAPS.Settings.basalProfile)
  31. promise(.success(()))
  32. case let .failure(error):
  33. promise(.failure(error))
  34. }
  35. }
  36. }.eraseToAnyPublisher()
  37. }
  38. func readProfile() -> AnyPublisher<Void, Error> {
  39. guard let pump = deviceManager?.pumpManager else {
  40. // storage.save(profile, as: OpenAPS.Settings.basalProfile)
  41. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  42. }
  43. // let syncValues = profile.map {
  44. // RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate))
  45. // }
  46. return Future { promise in
  47. pump.getBasalRateSchedule { result in
  48. switch result {
  49. case let .success(scheduleItems):
  50. var newProfile: [BasalProfileEntry] = []
  51. for item in scheduleItems.items {
  52. NSLog("getBasalRateSchedule \(item.startTime) \(item.value)")
  53. let startMinutes = Int(item.startTime / 60) // seconds to minutes
  54. let start = String(format: "%2d:%2d", startMinutes / 60, startMinutes % 60)
  55. let rate = Decimal(item.value)
  56. newProfile.append(BasalProfileEntry(
  57. start: start,
  58. minutes: startMinutes,
  59. rate: rate
  60. ))
  61. }
  62. for p in newProfile {
  63. NSLog("getBasalRateSchedule \(p.start) \(p.minutes) \(p.rate)")
  64. }
  65. self.storage.save(newProfile, as: OpenAPS.Settings.basalProfile)
  66. // self.profile = newProfile
  67. promise(.success(()))
  68. case let .failure(error):
  69. promise(.failure(error))
  70. }
  71. }
  72. }.eraseToAnyPublisher()
  73. }
  74. }
  75. }