|
@@ -14,7 +14,7 @@ struct ProfileManager {
|
|
|
var targetHighSchedule: [TimeValue<HKQuantity>]
|
|
var targetHighSchedule: [TimeValue<HKQuantity>]
|
|
|
var overrides: [Override]
|
|
var overrides: [Override]
|
|
|
var units: HKUnit
|
|
var units: HKUnit
|
|
|
- var timezone: String
|
|
|
|
|
|
|
+ var timezone: TimeZone
|
|
|
var defaultProfile: String
|
|
var defaultProfile: String
|
|
|
|
|
|
|
|
struct TimeValue<T> {
|
|
struct TimeValue<T> {
|
|
@@ -38,19 +38,20 @@ struct ProfileManager {
|
|
|
self.targetHighSchedule = []
|
|
self.targetHighSchedule = []
|
|
|
self.overrides = []
|
|
self.overrides = []
|
|
|
self.units = .millimolesPerLiter
|
|
self.units = .millimolesPerLiter
|
|
|
- self.timezone = "UTC"
|
|
|
|
|
|
|
+ self.timezone = TimeZone.current
|
|
|
self.defaultProfile = ""
|
|
self.defaultProfile = ""
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
mutating func loadProfile(from profileData: NSProfile) {
|
|
mutating func loadProfile(from profileData: NSProfile) {
|
|
|
- guard let store = profileData.store["default"] ?? profileData.store["Default"] else {
|
|
|
|
|
|
|
+ guard let store = profileData.store[profileData.defaultProfile] else {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- self.units = profileData.units.lowercased() == "mg/dl" ? .milligramsPerDeciliter : .millimolesPerLiter
|
|
|
|
|
- self.timezone = store.timezone
|
|
|
|
|
|
|
+ self.units = store.units.lowercased() == "mg/dl" ? .milligramsPerDeciliter : .millimolesPerLiter
|
|
|
self.defaultProfile = profileData.defaultProfile
|
|
self.defaultProfile = profileData.defaultProfile
|
|
|
|
|
|
|
|
|
|
+ self.timezone = getTimeZone(from: store.timezone)
|
|
|
|
|
+
|
|
|
self.isfSchedule = store.sens.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: HKQuantity(unit: self.units, doubleValue: $0.value)) }
|
|
self.isfSchedule = store.sens.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: HKQuantity(unit: self.units, doubleValue: $0.value)) }
|
|
|
self.basalSchedule = store.basal.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
|
|
self.basalSchedule = store.basal.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
|
|
|
self.carbRatioSchedule = store.carbratio.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
|
|
self.carbRatioSchedule = store.carbratio.map { TimeValue(timeAsSeconds: Int($0.timeAsSeconds), value: $0.value) }
|
|
@@ -66,7 +67,7 @@ struct ProfileManager {
|
|
|
func currentISF() -> HKQuantity? {
|
|
func currentISF() -> HKQuantity? {
|
|
|
return getCurrentValue(from: isfSchedule)
|
|
return getCurrentValue(from: isfSchedule)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
func currentBasal() -> String? {
|
|
func currentBasal() -> String? {
|
|
|
if let basal = getCurrentValue(from: basalSchedule) {
|
|
if let basal = getCurrentValue(from: basalSchedule) {
|
|
|
return Localizer.formatToLocalizedString(basal, maxFractionDigits: 2, minFractionDigits: 0)
|
|
return Localizer.formatToLocalizedString(basal, maxFractionDigits: 2, minFractionDigits: 0)
|
|
@@ -90,7 +91,9 @@ struct ProfileManager {
|
|
|
guard !schedule.isEmpty else { return nil }
|
|
guard !schedule.isEmpty else { return nil }
|
|
|
|
|
|
|
|
let now = Date()
|
|
let now = Date()
|
|
|
- let calendar = Calendar.current
|
|
|
|
|
|
|
+ var calendar = Calendar.current
|
|
|
|
|
+ calendar.timeZone = self.timezone
|
|
|
|
|
+
|
|
|
let currentTimeInSeconds = calendar.component(.hour, from: now) * 3600 +
|
|
let currentTimeInSeconds = calendar.component(.hour, from: now) * 3600 +
|
|
|
calendar.component(.minute, from: now) * 60 +
|
|
calendar.component(.minute, from: now) * 60 +
|
|
|
calendar.component(.second, from: now)
|
|
calendar.component(.second, from: now)
|
|
@@ -106,6 +109,33 @@ struct ProfileManager {
|
|
|
return lastValue
|
|
return lastValue
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private func getTimeZone(from identifier: String) -> TimeZone {
|
|
|
|
|
+ if let timeZone = TimeZone(identifier: identifier) {
|
|
|
|
|
+ return timeZone
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let adjustedIdentifier = identifier.replacingOccurrences(of: "ETC/", with: "Etc/")
|
|
|
|
|
+ if let timeZone = TimeZone(identifier: adjustedIdentifier) {
|
|
|
|
|
+ return timeZone
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if identifier.uppercased().contains("GMT") {
|
|
|
|
|
+ let components = identifier.uppercased().components(separatedBy: "GMT")
|
|
|
|
|
+ if components.count > 1 {
|
|
|
|
|
+ let offsetString = components[1]
|
|
|
|
|
+ if let offsetHours = Int(offsetString) {
|
|
|
|
|
+ let correctedOffsetHours = -offsetHours
|
|
|
|
|
+ let secondsFromGMT = correctedOffsetHours * 3600
|
|
|
|
|
+ if let timeZone = TimeZone(secondsFromGMT: secondsFromGMT) {
|
|
|
|
|
+ return timeZone
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return TimeZone.current
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
mutating func clear() {
|
|
mutating func clear() {
|
|
|
self.isfSchedule = []
|
|
self.isfSchedule = []
|
|
|
self.basalSchedule = []
|
|
self.basalSchedule = []
|
|
@@ -113,8 +143,8 @@ struct ProfileManager {
|
|
|
self.targetLowSchedule = []
|
|
self.targetLowSchedule = []
|
|
|
self.targetHighSchedule = []
|
|
self.targetHighSchedule = []
|
|
|
self.overrides = []
|
|
self.overrides = []
|
|
|
- self.units = HKUnit.millimolesPerLiter
|
|
|
|
|
- self.timezone = "UTC"
|
|
|
|
|
|
|
+ self.units = .millimolesPerLiter
|
|
|
|
|
+ self.timezone = TimeZone.current
|
|
|
self.defaultProfile = ""
|
|
self.defaultProfile = ""
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|