SettingsManager.swift 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import Foundation
  2. import LoopKit
  3. import Swinject
  4. protocol SettingsManager: AnyObject {
  5. var settings: FreeAPSSettings { get set }
  6. var preferences: Preferences { get set }
  7. var pumpSettings: PumpSettings { get }
  8. func updateInsulinCurve(_ insulinType: InsulinType?)
  9. }
  10. protocol SettingsObserver {
  11. func settingsDidChange(_: FreeAPSSettings)
  12. }
  13. protocol PreferencesObserver {
  14. func preferencesDidChange(_: Preferences)
  15. }
  16. final class BaseSettingsManager: SettingsManager, Injectable {
  17. @Injected() var broadcaster: Broadcaster!
  18. @Injected() var storage: FileStorage!
  19. @SyncAccess var settings: FreeAPSSettings {
  20. didSet {
  21. if oldValue != settings {
  22. saveSettings()
  23. DispatchQueue.main.async {
  24. self.broadcaster.notify(SettingsObserver.self, on: .main) {
  25. $0.settingsDidChange(self.settings)
  26. }
  27. }
  28. }
  29. }
  30. }
  31. @SyncAccess var preferences: Preferences {
  32. didSet {
  33. if oldValue != preferences {
  34. savePreferences()
  35. DispatchQueue.main.async {
  36. self.broadcaster.notify(PreferencesObserver.self, on: .main) {
  37. $0.preferencesDidChange(self.preferences)
  38. }
  39. }
  40. }
  41. }
  42. }
  43. private func saveSettings() {
  44. storage.save(settings, as: OpenAPS.FreeAPS.settings)
  45. }
  46. private func savePreferences() {
  47. storage.save(preferences, as: OpenAPS.Settings.preferences)
  48. }
  49. init(resolver: Resolver) {
  50. let storage = resolver.resolve(FileStorage.self)!
  51. settings = storage.retrieve(OpenAPS.FreeAPS.settings, as: FreeAPSSettings.self)
  52. ?? FreeAPSSettings(from: OpenAPS.defaults(for: OpenAPS.FreeAPS.settings))
  53. ?? FreeAPSSettings()
  54. preferences =
  55. storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self)
  56. ?? Preferences(from: OpenAPS.defaults(for: OpenAPS.Settings.preferences))
  57. ?? Preferences()
  58. injectServices(resolver)
  59. }
  60. var pumpSettings: PumpSettings {
  61. storage.retrieve(OpenAPS.Settings.settings, as: PumpSettings.self)
  62. ?? PumpSettings(from: OpenAPS.defaults(for: OpenAPS.Settings.settings))
  63. ?? PumpSettings(insulinActionCurve: 10, maxBolus: 10, maxBasal: 2)
  64. }
  65. func updateInsulinCurve(_ insulinType: InsulinType?) {
  66. var prefs = preferences
  67. switch insulinType {
  68. case .apidra,
  69. .humalog,
  70. .novolog:
  71. prefs.curve = .rapidActing
  72. case .fiasp,
  73. .lyumjev:
  74. prefs.curve = .ultraRapid
  75. default:
  76. prefs.curve = .rapidActing
  77. }
  78. preferences = prefs
  79. savePreferences()
  80. }
  81. }