PreferencesEditorProvider.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import Foundation
  2. import HealthKit
  3. extension PreferencesEditor {
  4. final class Provider: BaseProvider, PreferencesEditorProvider {
  5. @Injected() private var settingsManager: SettingsManager!
  6. @Injected() var fetchGlucoseManager: FetchGlucoseManager!
  7. private let processQueue = DispatchQueue(label: "PreferencesEditorProvider.processQueue")
  8. var preferences: Preferences {
  9. settingsManager.preferences
  10. }
  11. func savePreferences(_ preferences: Preferences) {
  12. processQueue.async {
  13. var prefs = preferences
  14. prefs.timestamp = Date()
  15. self.storage.save(prefs, as: OpenAPS.Settings.preferences)
  16. }
  17. }
  18. func updateManagerUnits() {
  19. var manager = fetchGlucoseManager.cgmManager
  20. let managerName = manager.map { "\(type(of: $0))" } ?? "nil"
  21. let units = settingsManager.settings.units
  22. let loopkitUnits: HKUnit = units == .mgdL ? .milligramsPerDeciliter : .millimolesPerLiter
  23. print("manager: \(managerName) is changing units to: \(loopkitUnits.description) ")
  24. manager?.unitDidChange(to: loopkitUnits)
  25. }
  26. func migrateUnits() {
  27. migrateTargets()
  28. migrateISF()
  29. }
  30. private func migrateTargets() {
  31. let profile = storage.retrieve(OpenAPS.Settings.bgTargets, as: BGTargets.self)
  32. ?? BGTargets(from: OpenAPS.defaults(for: OpenAPS.Settings.bgTargets))
  33. ?? BGTargets(units: .mmolL, userPrefferedUnits: .mmolL, targets: [])
  34. let units = settingsManager.settings.units
  35. guard units != profile.units else { return }
  36. let targets = profile.targets.map { target -> BGTargetEntry in
  37. if units == .mmolL {
  38. return BGTargetEntry(
  39. low: Decimal(round(Double(target.low.asMmolL) * 10) / 10),
  40. high: Decimal(round(Double(target.high.asMmolL) * 10) / 10),
  41. start: target.start,
  42. offset: target.offset
  43. )
  44. } else {
  45. return BGTargetEntry(
  46. low: Decimal(round(Double(target.low.asMgdL))),
  47. high: Decimal(round(Double(target.high.asMgdL))),
  48. start: target.start,
  49. offset: target.offset
  50. )
  51. }
  52. }
  53. let newProfile = BGTargets(units: units, userPrefferedUnits: units, targets: targets)
  54. storage.save(newProfile, as: OpenAPS.Settings.bgTargets)
  55. }
  56. private func migrateISF() {
  57. let profile = storage.retrieve(OpenAPS.Settings.insulinSensitivities, as: InsulinSensitivities.self)
  58. ?? InsulinSensitivities(from: OpenAPS.defaults(for: OpenAPS.Settings.insulinSensitivities))
  59. ?? InsulinSensitivities(
  60. units: .mmolL,
  61. userPrefferedUnits: .mmolL,
  62. sensitivities: []
  63. )
  64. let units = settingsManager.settings.units
  65. guard units != profile.units else { return }
  66. let sensitivities = profile.sensitivities.map { item -> InsulinSensitivityEntry in
  67. if units == .mmolL {
  68. return InsulinSensitivityEntry(
  69. sensitivity: Decimal(round(Double(item.sensitivity.asMmolL) * 10) / 10),
  70. offset: item.offset,
  71. start: item.start
  72. )
  73. } else {
  74. return InsulinSensitivityEntry(
  75. sensitivity: Decimal(round(Double(item.sensitivity.asMgdL))),
  76. offset: item.offset,
  77. start: item.start
  78. )
  79. }
  80. }
  81. let newProfile = InsulinSensitivities(units: units, userPrefferedUnits: units, sensitivities: sensitivities)
  82. storage.save(newProfile, as: OpenAPS.Settings.insulinSensitivities)
  83. }
  84. }
  85. }