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
2 changes: 1 addition & 1 deletion Cartfile
Original file line number Diff line number Diff line change
@@ -1 +1 @@
github "LoopKit/LoopKit" == 2.1.3
github "LoopKit/LoopKit" == 2.1.5
2 changes: 1 addition & 1 deletion Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -1 +1 @@
github "LoopKit/LoopKit" "v2.1.3"
github "LoopKit/LoopKit" "v2.1.5"
2 changes: 1 addition & 1 deletion Crypto/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.0.6</string>
<string>2.0.7</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
Expand Down
2 changes: 1 addition & 1 deletion MinimedKit/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.0.6</string>
<string>2.0.7</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
Expand Down
28 changes: 10 additions & 18 deletions MinimedKit/PumpManager/MinimedPumpManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -197,20 +197,13 @@ public class MinimedPumpManager: RileyLinkPumpManager, PumpManager {
// How long we should wait before we re-tune the RileyLink
let tuneTolerance = TimeInterval(minutes: 14)

let deviceState = deviceStates[device.peripheralIdentifier, default: DeviceState()]
let lastTuned = deviceState.lastTuned ?? .distantPast
let lastTuned = state.lastTuned ?? .distantPast

if lastTuned.timeIntervalSinceNow <= -tuneTolerance {
pumpOps.runSession(withName: "Tune pump", using: device) { (session) in
do {
let scanResult = try session.tuneRadio(current: deviceState.lastValidFrequency)
let scanResult = try session.tuneRadio()
self.log.error("Device %{public}@ auto-tuned to %{public}@ MHz", device.name ?? "", String(describing: scanResult.bestFrequency))
self.queue.async {
self.deviceStates[device.peripheralIdentifier] = DeviceState(
lastTuned: Date(),
lastValidFrequency: scanResult.bestFrequency
)
}
} catch let error {
self.log.error("Device %{public}@ auto-tune failed with error: %{public}@", device.name ?? "", String(describing: error))
self.rileyLinkDeviceProvider.deprioritize(device, completion: nil)
Expand Down Expand Up @@ -262,14 +255,13 @@ public class MinimedPumpManager: RileyLinkPumpManager, PumpManager {
device.getStatus { (deviceStatus) in
// Trigger device status upload, even if something is wrong with pumpStatus
self.queue.async {
let deviceState = self.deviceStates[device.peripheralIdentifier]

let pumpManagerStatus = PumpManagerStatus(
date: pumpDate,
timeZone: timeZone,
device: deviceStatus.device(pumpID: self.state.pumpID, pumpModel: self.state.pumpModel),
lastValidFrequency: deviceState?.lastValidFrequency,
lastTuned: deviceState?.lastTuned,
lastValidFrequency: self.state.lastValidFrequency,
lastTuned: self.state.lastTuned,
battery: PumpManagerStatus.BatteryStatus(percent: Double(status.batteryRemainingPercent) / 100),
isSuspended: nil,
isBolusing: nil,
Expand Down Expand Up @@ -454,13 +446,12 @@ public class MinimedPumpManager: RileyLinkPumpManager, PumpManager {

device.getStatus { (deviceStatus) in
self.queue.async {
let deviceState = self.deviceStates[device.peripheralIdentifier]
let pumpManagerStatus = PumpManagerStatus(
date: date,
timeZone: session.pump.timeZone,
device: deviceStatus.device(pumpID: self.state.pumpID, pumpModel: self.state.pumpModel),
lastValidFrequency: deviceState?.lastValidFrequency,
lastTuned: deviceState?.lastTuned,
lastValidFrequency: self.state.lastValidFrequency,
lastTuned: self.state.lastTuned,
battery: PumpManagerStatus.BatteryStatus(
voltage: status.batteryVolts,
state: {
Expand Down Expand Up @@ -598,14 +589,15 @@ public class MinimedPumpManager: RileyLinkPumpManager, PumpManager {
// MARK: - Configuration

// MARK: Pump

// TODO
public func getStateForDevice(_ device: RileyLinkDevice, completion: @escaping (_ deviceState: DeviceState, _ pumpOps: PumpOps) -> Void) {
public func getOpsForDevice(_ device: RileyLinkDevice, completion: @escaping (_ pumpOps: PumpOps) -> Void) {
queue.async {
completion(self.deviceStates[device.peripheralIdentifier, default: DeviceState()], self.pumpOps)
completion(self.pumpOps)
}
}


public private(set) var pumpOps: PumpOps!

/// The user's preferred method of fetching insulin data from the pump
Expand Down
27 changes: 25 additions & 2 deletions MinimedKit/PumpManager/MinimedPumpManagerState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
public var pumpID: String

public var pumpRegion: PumpRegion

public var lastValidFrequency: Measurement<UnitFrequency>?

public var lastTuned: Date?

public var pumpSettings: PumpSettings {
get {
Expand All @@ -42,12 +46,16 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
var state = PumpState()
state.pumpModel = pumpModel
state.timeZone = timeZone
state.lastValidFrequency = lastValidFrequency
state.lastTuned = lastTuned
return state
}
set {
if let model = newValue.pumpModel {
pumpModel = model
}
lastValidFrequency = newValue.lastValidFrequency
lastTuned = newValue.lastTuned
timeZone = newValue.timeZone
}
}
Expand All @@ -56,7 +64,7 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {

public var timeZone: TimeZone

public init(batteryChemistry: BatteryChemistryType = .alkaline, preferredInsulinDataSource: InsulinDataSource = .pumpHistory, pumpColor: PumpColor, pumpID: String, pumpModel: PumpModel, pumpRegion: PumpRegion, rileyLinkConnectionManagerState: RileyLinkConnectionManagerState?, timeZone: TimeZone) {
public init(batteryChemistry: BatteryChemistryType = .alkaline, preferredInsulinDataSource: InsulinDataSource = .pumpHistory, pumpColor: PumpColor, pumpID: String, pumpModel: PumpModel, pumpRegion: PumpRegion, rileyLinkConnectionManagerState: RileyLinkConnectionManagerState?, timeZone: TimeZone, lastValidFrequency: Measurement<UnitFrequency>? = nil) {
self.batteryChemistry = batteryChemistry
self.preferredInsulinDataSource = preferredInsulinDataSource
self.pumpColor = pumpColor
Expand All @@ -65,6 +73,7 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
self.pumpRegion = pumpRegion
self.rileyLinkConnectionManagerState = rileyLinkConnectionManagerState
self.timeZone = timeZone
self.lastValidFrequency = lastValidFrequency
}

public init?(rawValue: RawValue) {
Expand Down Expand Up @@ -104,6 +113,13 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
}
}

let lastValidFrequency: Measurement<UnitFrequency>?
if let frequencyRaw = rawValue["lastValidFrequency"] as? Double {
lastValidFrequency = Measurement<UnitFrequency>(value: frequencyRaw, unit: .megahertz)
} else {
lastValidFrequency = nil
}

self.init(
batteryChemistry: batteryChemistry,
preferredInsulinDataSource: insulinDataSource,
Expand All @@ -112,7 +128,8 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
pumpModel: pumpModel,
pumpRegion: pumpRegion,
rileyLinkConnectionManagerState: rileyLinkConnectionManagerState,
timeZone: timeZone
timeZone: timeZone,
lastValidFrequency: lastValidFrequency
)
}

Expand All @@ -132,6 +149,11 @@ public struct MinimedPumpManagerState: RawRepresentable, Equatable {
if let rileyLinkConnectionManagerState = rileyLinkConnectionManagerState {
value["rileyLinkConnectionManagerState"] = rileyLinkConnectionManagerState.rawValue
}

if let frequency = lastValidFrequency?.converted(to: .megahertz) {
value["lastValidFrequency"] = frequency.value
}

return value
}
}
Expand All @@ -152,6 +174,7 @@ extension MinimedPumpManagerState: CustomDebugStringConvertible {
"pumpID: ✔︎",
"pumpModel: \(pumpModel.rawValue)",
"pumpRegion: \(pumpRegion)",
"lastValidFrequency: \(String(describing: lastValidFrequency))",
"timeZone: \(timeZone)",
String(reflecting: rileyLinkConnectionManagerState),
].joined(separator: "\n")
Expand Down
15 changes: 14 additions & 1 deletion MinimedKit/PumpManager/PumpOps.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public class PumpOps {
}

private var configuredDevices: Set<RileyLinkDevice> = Set()

private var sessionDevice: RileyLinkDevice?

private let sessionQueue = DispatchQueue(label: "com.rileylink.RileyLinkKit.PumpOps", qos: .utility)

Expand Down Expand Up @@ -69,8 +71,10 @@ public class PumpOps {

device.runSession(withName: name) { (session) in
let session = PumpOpsSession(settings: self.pumpSettings, pumpState: self.pumpState, session: session, delegate: self)
self.sessionDevice = device
self.configureDevice(device, with: session)
block(session)
self.sessionDevice = nil
semaphore.signal()
}

Expand All @@ -85,7 +89,7 @@ public class PumpOps {
}

do {
_ = try session.configureRadio(for: pumpSettings.pumpRegion)
_ = try session.configureRadio(for: pumpSettings.pumpRegion, frequency: pumpState.lastValidFrequency)
} catch {
// Ignore the error and let the block run anyway
return
Expand Down Expand Up @@ -116,6 +120,15 @@ public class PumpOps {


extension PumpOps: PumpOpsSessionDelegate {

func pumpOpsSessionDidChangeRadioConfig(_ session: PumpOpsSession) {
sessionQueue.async {
if let sessionDevice = self.sessionDevice {
self.configuredDevices = [sessionDevice]
}
}
}

func pumpOpsSession(_ session: PumpOpsSession, didChange state: PumpState) {
self.pumpState = state
}
Expand Down
16 changes: 15 additions & 1 deletion MinimedKit/PumpManager/PumpState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ public struct PumpState: RawRepresentable, Equatable {

public var awakeUntil: Date?

public var lastValidFrequency: Measurement<UnitFrequency>?

public var lastTuned: Date?

var isAwake: Bool {
if let awakeUntil = awakeUntil {
return awakeUntil.timeIntervalSinceNow > 0
Expand All @@ -41,10 +45,14 @@ public struct PumpState: RawRepresentable, Equatable {
}

self.timeZone = timeZone

if let pumpModelNumber = rawValue["pumpModel"] as? PumpModel.RawValue {
pumpModel = PumpModel(rawValue: pumpModelNumber)
}

if let frequencyRaw = rawValue["lastValidFrequency"] as? Double {
lastValidFrequency = Measurement<UnitFrequency>(value: frequencyRaw, unit: .megahertz)
}
}

public var rawValue: RawValue {
Expand All @@ -55,6 +63,10 @@ public struct PumpState: RawRepresentable, Equatable {
if let pumpModel = pumpModel {
rawValue["pumpModel"] = pumpModel.rawValue
}

if let frequency = lastValidFrequency?.converted(to: .megahertz) {
rawValue["lastValidFrequency"] = frequency.value
}

return rawValue
}
Expand All @@ -69,6 +81,8 @@ extension PumpState: CustomDebugStringConvertible {
"timeZone: \(timeZone)",
"pumpModel: \(pumpModel?.rawValue ?? "")",
"awakeUntil: \(awakeUntil ?? .distantPast)",
"lastValidFrequency: \(String(describing: lastValidFrequency))",
"lastTuned: \(awakeUntil ?? .distantPast))",
"lastWakeAttempt: \(String(describing: lastWakeAttempt))"
].joined(separator: "\n")
}
Expand Down
2 changes: 1 addition & 1 deletion MinimedKitTests/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>2.0.6</string>
<string>2.0.7</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
Expand Down
5 changes: 5 additions & 0 deletions MinimedKitTests/PumpOpsSynchronousTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,11 @@ extension PumpMessageSenderStub: PumpOpsSessionDelegate {
func pumpOpsSession(_ session: PumpOpsSession, didChange state: PumpState) {

}

func pumpOpsSessionDidChangeRadioConfig(_ session: PumpOpsSession) {

}

}

func array(_ timestampedEvents: [TimestampedHistoryEvent], containsPumpEvent pumpEvent: PumpEvent) -> Bool {
Expand Down
15 changes: 2 additions & 13 deletions MinimedKitUI/CommandResponseViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -297,23 +297,12 @@ extension CommandResponseViewController {
}
}

static func tuneRadio(ops: PumpOps?, device: RileyLinkDevice, current: Measurement<UnitFrequency>?, measurementFormatter: MeasurementFormatter) -> T {
static func tuneRadio(ops: PumpOps?, device: RileyLinkDevice, measurementFormatter: MeasurementFormatter) -> T {
return T { (completionHandler) -> String in
ops?.runSession(withName: "Tune pump", using: device) { (session) in
let response: String
do {
let scanResult = try session.tuneRadio(current: nil)

NotificationCenter.default.post(
name: .DeviceStateDidChange,
object: device,
userInfo: [
RileyLinkDevice.notificationDeviceStateKey: DeviceState(
lastTuned: Date(),
lastValidFrequency: scanResult.bestFrequency
)
]
)
let scanResult = try session.tuneRadio()

var resultDict: [String: Any] = [:]

Expand Down
2 changes: 1 addition & 1 deletion MinimedKitUI/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.0.6</string>
<string>2.0.7</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
Expand Down
3 changes: 1 addition & 2 deletions MinimedKitUI/MinimedPumpSettingsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,10 @@ class MinimedPumpSettingsViewController: RileyLinkSettingsViewController {
case .rileyLinks:
let device = devicesDataSource.devices[indexPath.row]

pumpManager.getStateForDevice(device) { (deviceState, pumpOps) in
pumpManager.getOpsForDevice(device) { (pumpOps) in
DispatchQueue.main.async {
let vc = RileyLinkMinimedDeviceTableViewController(
device: device,
deviceState: deviceState,
pumpOps: pumpOps
)

Expand Down
Loading