PumpSettingsEditorProvider.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import Combine
  2. import HealthKit
  3. import LoopKit
  4. import LoopKitUI
  5. protocol PumpSettingsObserver {
  6. func pumpSettingsDidChange(_ pumpSettings: PumpSettings)
  7. }
  8. extension PumpSettingsEditor {
  9. final class Provider: BaseProvider, PumpSettingsEditorProvider {
  10. private let processQueue = DispatchQueue(label: "PumpSettingsEditorProvider.processQueue")
  11. @Injected() private var broadcaster: Broadcaster!
  12. func settings() -> PumpSettings {
  13. storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self)
  14. ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings))
  15. ?? PumpSettings(insulinActionCurve: 6, maxBolus: 10, maxBasal: 2)
  16. }
  17. func save(settings: PumpSettings) -> AnyPublisher<Void, Error> {
  18. func save(_ settings: PumpSettings) {
  19. storage.save(settings, as: OpenAPS.Settings.settings)
  20. processQueue.async {
  21. self.broadcaster.notify(PumpSettingsObserver.self, on: self.processQueue) {
  22. $0.pumpSettingsDidChange(settings)
  23. }
  24. }
  25. }
  26. guard let pump = deviceManager?.pumpManager else {
  27. save(settings)
  28. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  29. }
  30. // Don't ask why 🤦‍♂️
  31. // let sync = DeliveryLimitSettingsTableViewController(style: .grouped)
  32. let limits = DeliveryLimits(
  33. maximumBasalRate: HKQuantity(unit: .internationalUnitsPerHour, doubleValue: Double(settings.maxBasal)),
  34. maximumBolus: HKQuantity(unit: .internationalUnit(), doubleValue: Double(settings.maxBolus))
  35. )
  36. // sync.maximumBasalRatePerHour = Double(settings.maxBasal)
  37. // sync.maximumBolus = Double(settings.maxBolus)
  38. return Future { promise in
  39. self.processQueue.async {
  40. pump.syncDeliveryLimits(limits: limits) { result in
  41. switch result {
  42. case let .success(actual):
  43. // Store the limits from the pumpManager to ensure the correct values
  44. // Example: Dana pumps don't allow to set these limits, only to fetch them
  45. // This will ensure we always have the correct values stored
  46. save(PumpSettings(
  47. insulinActionCurve: settings.insulinActionCurve,
  48. maxBolus: Decimal(
  49. actual.maximumBolus?
  50. .doubleValue(for: .internationalUnit()) ?? Double(settings.maxBolus)
  51. ),
  52. maxBasal: Decimal(
  53. actual.maximumBasalRate?
  54. .doubleValue(for: .internationalUnitsPerHour) ?? Double(settings.maxBasal)
  55. )
  56. ))
  57. promise(.success(()))
  58. case let .failure(error):
  59. promise(.failure(error))
  60. }
  61. }
  62. }
  63. }.eraseToAnyPublisher()
  64. }
  65. }
  66. }