PumpSettingsEditorProvider.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import Combine
  2. import LoopKit
  3. import LoopKitUI
  4. protocol PumpSettingsObserver {
  5. func pumpSettingsDidChange(_ pumpSettings: PumpSettings)
  6. }
  7. extension PumpSettingsEditor {
  8. final class Provider: BaseProvider, PumpSettingsEditorProvider {
  9. private let processQueue = DispatchQueue(label: "PumpSettingsEditorProvider.processQueue")
  10. @Injected() private var broadcaster: Broadcaster!
  11. func settings() -> PumpSettings {
  12. storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self)
  13. ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings))
  14. ?? PumpSettings(insulinActionCurve: 5, maxBolus: 10, maxBasal: 2)
  15. }
  16. func save(settings: PumpSettings) -> AnyPublisher<Void, Error> {
  17. func save() {
  18. storage.save(settings, as: OpenAPS.Settings.settings)
  19. processQueue.async {
  20. self.broadcaster.notify(PumpSettingsObserver.self, on: self.processQueue) {
  21. $0.pumpSettingsDidChange(settings)
  22. }
  23. }
  24. }
  25. guard let pump = deviceManager?.pumpManager else {
  26. save()
  27. return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
  28. }
  29. // Don't ask why 🤦‍♂️
  30. let sync = DeliveryLimitSettingsTableViewController(style: .grouped)
  31. sync.maximumBasalRatePerHour = Double(settings.maxBasal)
  32. sync.maximumBolus = Double(settings.maxBolus)
  33. return Future { promise in
  34. self.processQueue.async {
  35. pump.syncDeliveryLimitSettings(for: sync) { result in
  36. switch result {
  37. case .success:
  38. save()
  39. promise(.success(()))
  40. case let .failure(error):
  41. promise(.failure(error))
  42. }
  43. }
  44. }
  45. }.eraseToAnyPublisher()
  46. }
  47. }
  48. }