NightscoutConfigProvider.swift 3.1 KB

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