AlgorithmAdvancedSettingsProvider.swift 3.3 KB

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