Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions TidepoolService.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
C12E4BBB288F2215009C98A2 /* TidepoolServiceKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A9DAACFF22E7987800E76C9F /* TidepoolServiceKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C12E4BBE288F2215009C98A2 /* TidepoolServiceKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9DAAD1B22E7988900E76C9F /* TidepoolServiceKitUI.framework */; platformFilter = ios; };
C12E4BBF288F2215009C98A2 /* TidepoolServiceKitUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A9DAAD1B22E7988900E76C9F /* TidepoolServiceKitUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C14559A62C7CF49100541EF1 /* TemporaryScheduleOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = C14559A52C7CF49100541EF1 /* TemporaryScheduleOverride.swift */; };
C1A685432C067E410071C171 /* DeviceLogUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A685422C067E410071C171 /* DeviceLogUploader.swift */; };
C1C9414629F0CB21008D3E05 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C9414529F0CB21008D3E05 /* UIImage.swift */; };
C1D0B62929848A460098D215 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D0B62829848A460098D215 /* SettingsView.swift */; };
Expand Down Expand Up @@ -226,6 +227,7 @@
C110888E2A39149100BA4898 /* BuildDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildDetails.swift; sourceTree = "<group>"; };
C12522E1298309B5006EA1CD /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
C1317D4129830A0800625B94 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
C14559A52C7CF49100541EF1 /* TemporaryScheduleOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemporaryScheduleOverride.swift; sourceTree = "<group>"; };
C18B726B299581C600F138D3 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
C192C60B29C78711001EFEA6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = "<group>"; };
C199E4D929C64072003D32F7 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; };
Expand Down Expand Up @@ -322,6 +324,7 @@
A97A60FA243818C900AD69A5 /* TDatum.swift */,
A9752A9C270B972D00E50750 /* TimeInterval.swift */,
A9D10DB727AB2CCF00814B7B /* SyncAlertObject.swift */,
C14559A52C7CF49100541EF1 /* TemporaryScheduleOverride.swift */,
);
path = Extensions;
sourceTree = "<group>";
Expand Down Expand Up @@ -766,6 +769,7 @@
A98737CD2788E61400A6A23D /* InsulinType.swift in Sources */,
A9D1AC9B27B1E046008C5A12 /* Data.swift in Sources */,
A9F9F319271A05B100D19374 /* IdentifiableHKDatum.swift in Sources */,
C14559A62C7CF49100541EF1 /* TemporaryScheduleOverride.swift in Sources */,
A9057687271F770F0030C3B1 /* IdentifiableDatum.swift in Sources */,
A97651752421AA10002EB5D4 /* OSLog.swift in Sources */,
A9DAAD3622E7CAC100E76C9F /* TidepoolService.swift in Sources */,
Expand Down
74 changes: 0 additions & 74 deletions TidepoolServiceKit/Extensions/StoredSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -390,80 +390,6 @@ fileprivate extension TemporaryScheduleOverridePreset {
var datumDuration: TimeInterval? { duration.isFinite ? duration.timeInterval : nil }
}

fileprivate extension TemporaryScheduleOverride {
var datumTime: Date { startDate }

var datumOverrideType: TPumpSettingsOverrideDeviceEventDatum.OverrideType { context.datumOverrideType }

var datumOverridePreset: String? {
guard case .preset(let preset) = context else {
return nil
}
return preset.name
}

var datumMethod: TPumpSettingsOverrideDeviceEventDatum.Method? { .manual }

var datumDuration: TimeInterval? {
switch duration {
case .finite(let interval):
return interval
case .indefinite:
return nil
}
}

var datumExpectedDuration: TimeInterval? { nil }

var datumBloodGlucoseTarget: TPumpSettingsOverrideDeviceEventDatum.BloodGlucoseTarget? { settings.datumBloodGlucoseTarget }

var datumBasalRateScaleFactor: Double? { settings.datumBasalRateScaleFactor }

var datumCarbohydrateRatioScaleFactor: Double? { settings.datumCarbohydrateRatioScaleFactor }

var datumInsulinSensitivityScaleFactor: Double? { settings.datumInsulinSensitivityScaleFactor }

var datumUnits: TPumpSettingsOverrideDeviceEventDatum.Units? { settings.datumUnits }
}

fileprivate extension TemporaryScheduleOverride.Context {
var datumOverrideType: TPumpSettingsOverrideDeviceEventDatum.OverrideType {
switch self {
case .preMeal:
return .preprandial
case .legacyWorkout:
return .physicalActivity
case .preset(_):
return .preset
case .custom:
return .custom
}
}
}

fileprivate extension TemporaryScheduleOverrideSettings {
var datumBloodGlucoseTarget: TPumpSettingsDatum.BloodGlucoseTarget? {
guard let targetRange = targetRange else {
return nil
}
return TPumpSettingsDatum.BloodGlucoseTarget(low: targetRange.lowerBound.doubleValue(for: .milligramsPerDeciliter),
high: targetRange.upperBound.doubleValue(for: .milligramsPerDeciliter))
}

var datumBasalRateScaleFactor: Double? { basalRateMultiplier }

var datumCarbohydrateRatioScaleFactor: Double? { carbRatioMultiplier }

var datumInsulinSensitivityScaleFactor: Double? { insulinSensitivityMultiplier }

var datumUnits: TPumpSettingsOverrideDeviceEventDatum.Units? {
guard targetRange != nil else {
return nil
}
return TPumpSettingsOverrideDeviceEventDatum.Units(bloodGlucose: .milligramsPerDeciliter)
}
}

extension TCGMSettingsDatum: TypedDatum {
static var resolvedType: String { TDatum.DatumType.cgmSettings.rawValue }
}
Expand Down
120 changes: 120 additions & 0 deletions TidepoolServiceKit/Extensions/TemporaryScheduleOverride.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
//
// TemporaryScheduleOverride.swift
// TidepoolServiceKit
//
// Created by Pete Schwamb on 8/26/24.
// Copyright © 2024 LoopKit Authors. All rights reserved.
//

import Foundation
import TidepoolKit
import LoopKit

fileprivate extension TemporaryScheduleOverride.Context {
var datumOverrideType: TPumpSettingsOverrideDeviceEventDatum.OverrideType {
switch self {
case .preMeal:
return .preprandial
case .legacyWorkout:
return .physicalActivity
case .preset(_):
return .preset
case .custom:
return .custom
}
}
}

extension TemporaryScheduleOverrideSettings {
var datumBloodGlucoseTarget: TPumpSettingsDatum.BloodGlucoseTarget? {
guard let targetRange = targetRange else {
return nil
}
return TPumpSettingsDatum.BloodGlucoseTarget(low: targetRange.lowerBound.doubleValue(for: .milligramsPerDeciliter),
high: targetRange.upperBound.doubleValue(for: .milligramsPerDeciliter))
}

var datumBasalRateScaleFactor: Double? { basalRateMultiplier }

var datumCarbohydrateRatioScaleFactor: Double? { carbRatioMultiplier }

var datumInsulinSensitivityScaleFactor: Double? { insulinSensitivityMultiplier }

var datumUnits: TPumpSettingsOverrideDeviceEventDatum.Units? {
guard targetRange != nil else {
return nil
}
return TPumpSettingsOverrideDeviceEventDatum.Units(bloodGlucose: .milligramsPerDeciliter)
}
}

extension TemporaryScheduleOverride: IdentifiableDatum {

var syncIdentifierAsString: String { syncIdentifier.uuidString }

func datum(for userId: String, hostIdentifier: String, hostVersion: String) -> TDatum {
let datum = TPumpSettingsOverrideDeviceEventDatum(time: datumTime,
overrideType: datumOverrideType,
overridePreset: datumOverridePreset,
method: datumMethod,
duration: datumDuration,
expectedDuration: datumExpectedDuration,
bloodGlucoseTarget: datumBloodGlucoseTarget,
basalRateScaleFactor: datumBasalRateScaleFactor,
carbohydrateRatioScaleFactor: datumCarbohydrateRatioScaleFactor,
insulinSensitivityScaleFactor: datumInsulinSensitivityScaleFactor,
units: datumUnits)
let origin = datumOrigin(for: resolvedIdentifier(for: TPumpSettingsOverrideDeviceEventDatum.self), hostIdentifier: hostIdentifier, hostVersion: hostVersion)
return datum.adornWith(id: datumId(for: userId, type: TPumpSettingsOverrideDeviceEventDatum.self),
payload: datumPayload,
origin: origin)
}

private var datumPayload: TDictionary {
var dictionary = TDictionary()
dictionary["syncIdentifier"] = syncIdentifierAsString
return dictionary
}

var datumTime: Date { startDate }

var datumOverrideType: TPumpSettingsOverrideDeviceEventDatum.OverrideType { context.datumOverrideType }

var datumOverridePreset: String? {
guard case .preset(let preset) = context else {
return nil
}
return preset.name
}

var datumMethod: TPumpSettingsOverrideDeviceEventDatum.Method? { .manual }

var datumDuration: TimeInterval? {
switch duration {
case .finite(let interval):
return interval
case .indefinite:
return nil
}
}

var datumExpectedDuration: TimeInterval? { nil }

var datumBloodGlucoseTarget: TPumpSettingsOverrideDeviceEventDatum.BloodGlucoseTarget? { settings.datumBloodGlucoseTarget }

var datumBasalRateScaleFactor: Double? { settings.datumBasalRateScaleFactor }

var datumCarbohydrateRatioScaleFactor: Double? { settings.datumCarbohydrateRatioScaleFactor }

var datumInsulinSensitivityScaleFactor: Double? { settings.datumInsulinSensitivityScaleFactor }

var datumUnits: TPumpSettingsOverrideDeviceEventDatum.Units? { settings.datumUnits }

}

extension TemporaryScheduleOverride {
var selectors: [TDatum.Selector] {
return [datumSelector(for: TPumpSettingsOverrideDeviceEventDatum.self)]
}
}

33 changes: 7 additions & 26 deletions TidepoolServiceKit/TidepoolService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -285,31 +285,12 @@ extension TidepoolService: TLogging {
extension TidepoolService: RemoteDataService {

public func uploadTemporaryOverrideData(updated: [TemporaryScheduleOverride], deleted: [TemporaryScheduleOverride]) async throws {
// TODO: https://tidepool.atlassian.net/browse/LOOP-4769

// The following code is taken from previous upload code when override events where stored in settings
// To be implemented with

// guard let activeOverride = activeOverride else {
// return nil
// }
// let datum = TPumpSettingsOverrideDeviceEventDatum(time: activeOverride.datumTime,
// overrideType: activeOverride.datumOverrideType,
// overridePreset: activeOverride.datumOverridePreset,
// method: activeOverride.datumMethod,
// duration: activeOverride.datumDuration,
// expectedDuration: activeOverride.datumExpectedDuration,
// bloodGlucoseTarget: activeOverride.datumBloodGlucoseTarget,
// basalRateScaleFactor: activeOverride.datumBasalRateScaleFactor,
// carbohydrateRatioScaleFactor: activeOverride.datumCarbohydrateRatioScaleFactor,
// insulinSensitivityScaleFactor: activeOverride.datumInsulinSensitivityScaleFactor,
// units: activeOverride.datumUnits)
// let origin = datumOrigin(for: resolvedIdentifier(for: TPumpSettingsOverrideDeviceEventDatum.self), hostIdentifier: hostIdentifier, hostVersion: hostVersion)
// return datum.adornWith(id: datumId(for: userId, type: TPumpSettingsOverrideDeviceEventDatum.self),
// timeZone: datumTimeZone,
// timeZoneOffset: datumTimeZoneOffset,
// payload: datumPayload,
// origin: origin)
guard let userId = userId, let hostIdentifier = hostIdentifier, let hostVersion = hostVersion else {
throw TidepoolServiceError.configuration
}

let _ = try await createData(updated.compactMap { $0.datum(for: userId, hostIdentifier: hostIdentifier, hostVersion: hostVersion) })
let _ = try await deleteData(withSelectors: deleted.flatMap { $0.selectors })
}

public var alertDataLimit: Int? { return 1000 }
Expand Down Expand Up @@ -440,7 +421,7 @@ extension TidepoolService: RemoteDataService {

func calculateSettingsData(_ stored: [StoredSettings], for userId: String, hostIdentifier: String, hostVersion: String) -> ([TDatum], [TDatum], TControllerSettingsDatum?, TCGMSettingsDatum?, TPumpSettingsDatum?) {
var created: [TDatum] = []
var updated: [TDatum] = []
let updated: [TDatum] = []
var lastControllerSettingsDatum = lastControllerSettingsDatum
var lastCGMSettingsDatum = lastCGMSettingsDatum
var lastPumpSettingsDatum = lastPumpSettingsDatum
Expand Down