BasalProfileEditorProvider.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 supportedBasalRates: [Decimal]? {
  13. deviceManager.pumpManager?.supportedBasalRates.map { Decimal($0) }
  14. }
  15. func saveProfile(_ profile: [BasalProfileEntry]) -> AnyPublisher<Void, Error> {
  16. guard let pump = deviceManager?.pumpManager else {
  17. storage.save(profile, as: OpenAPS.Settings.basalProfile)
  18. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  19. }
  20. let syncValues = profile.map {
  21. RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate))
  22. }
  23. return Future { promise in
  24. pump.syncBasalRateSchedule(items: syncValues) { result in
  25. switch result {
  26. case .success:
  27. self.storage.save(profile, as: OpenAPS.Settings.basalProfile)
  28. promise(.success(()))
  29. case let .failure(error):
  30. promise(.failure(error))
  31. }
  32. }
  33. }.eraseToAnyPublisher()
  34. }
  35. func readProfile() -> AnyPublisher<Void, Error> {
  36. guard let pump = deviceManager?.pumpManager else {
  37. // storage.save(profile, as: OpenAPS.Settings.basalProfile)
  38. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  39. }
  40. // let syncValues = profile.map {
  41. // RepeatingScheduleValue(startTime: TimeInterval($0.minutes * 60), value: Double($0.rate))
  42. // }
  43. return Future { promise in
  44. pump.getBasalRateSchedule { result in
  45. switch result {
  46. case let .success(scheduleItems):
  47. var newProfile: [BasalProfileEntry] = []
  48. for item in scheduleItems.items {
  49. NSLog("getBasalRateSchedule \(item.startTime) \(item.value)")
  50. let startMinutes = Int(item.startTime / 60) // seconds to minutes
  51. let start = String(format: "%2d:%2d", startMinutes / 60, startMinutes % 60)
  52. let rate = Decimal(item.value)
  53. newProfile.append(BasalProfileEntry(
  54. start: start,
  55. minutes: startMinutes,
  56. rate: rate
  57. ))
  58. }
  59. for p in newProfile {
  60. NSLog("getBasalRateSchedule \(p.start) \(p.minutes) \(p.rate)")
  61. }
  62. self.storage.save(newProfile, as: OpenAPS.Settings.basalProfile)
  63. // self.profile = newProfile
  64. promise(.success(()))
  65. case let .failure(error):
  66. promise(.failure(error))
  67. }
  68. }
  69. }.eraseToAnyPublisher()
  70. }
  71. }
  72. }