Skip to content

Multiple cycles triggered in short window. #1096

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
Oct 13, 2019
Merged
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
74 changes: 40 additions & 34 deletions Loop/Managers/DeviceDataManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ final class DeviceDataManager {
/// Should be accessed only on the main queue
private(set) var lastError: (date: Date, error: Error)?

/// The last time a BLE heartbeat was received by the pump manager
/// The last time a BLE heartbeat was received and acted upon.
private var lastBLEDrivenUpdate = Date.distantPast

// MARK: - CGM
Expand Down Expand Up @@ -155,6 +155,40 @@ final class DeviceDataManager {

return Manager.init(rawState: rawState) as? PumpManagerUI
}

private func processCGMResult(_ manager: CGMManager, result: CGMResult) {
switch result {
case .newData(let values):
log.default("CGMManager:\(type(of: manager)) did update with \(values.count) values")

loopManager.addGlucose(values) { result in
if manager.shouldSyncToRemoteService {
switch result {
case .success(let values):
self.nightscoutDataManager.uploadGlucose(values, sensorState: manager.sensorState)
case .failure:
break
}
}

self.log.default("Asserting current pump data")
self.pumpManager?.assertCurrentPumpData()
}
case .noData:
log.default("CGMManager:\(type(of: manager)) did update with no data")

pumpManager?.assertCurrentPumpData()
case .error(let error):
log.default("CGMManager:\(type(of: manager)) did update with error: \(error)")

self.setLastError(error: error)
log.default("Asserting current pump data")
pumpManager?.assertCurrentPumpData()
}

updatePumpManagerBLEHeartbeatPreference()
}


}

Expand Down Expand Up @@ -269,36 +303,8 @@ extension DeviceDataManager: CGMManagerDelegate {

func cgmManager(_ manager: CGMManager, didUpdateWith result: CGMResult) {
dispatchPrecondition(condition: .onQueue(queue))
switch result {
case .newData(let values):
log.default("CGMManager:\(type(of: manager)) did update with \(values.count) values")

loopManager.addGlucose(values) { result in
if manager.shouldSyncToRemoteService {
switch result {
case .success(let values):
self.nightscoutDataManager.uploadGlucose(values, sensorState: manager.sensorState)
case .failure:
break
}
}

self.log.default("Asserting current pump data")
self.pumpManager?.assertCurrentPumpData()
}
case .noData:
log.default("CGMManager:\(type(of: manager)) did update with no data")

pumpManager?.assertCurrentPumpData()
case .error(let error):
log.default("CGMManager:\(type(of: manager)) did update with error: \(error)")

self.setLastError(error: error)
log.default("Asserting current pump data")
pumpManager?.assertCurrentPumpData()
}

updatePumpManagerBLEHeartbeatPreference()
lastBLEDrivenUpdate = Date()
processCGMResult(manager, result: result);
}

func startDateToFilterNewData(for manager: CGMManager) -> Date? {
Expand Down Expand Up @@ -346,12 +352,12 @@ extension DeviceDataManager: PumpManagerDelegate {
bleHeartbeatUpdateInterval = .minutes(1)
case let interval?:
// If we looped successfully less than 5 minutes ago, ignore the heartbeat.
log.default("PumpManager:\(type(of: pumpManager)) ignoring heartbeat. Last loop completed \(interval.minutes) minutes ago")
log.default("PumpManager:\(type(of: pumpManager)) ignoring pumpManager heartbeat. Last loop completed \(-interval.minutes) minutes ago")
return
}

guard lastBLEDrivenUpdate.timeIntervalSinceNow <= -bleHeartbeatUpdateInterval else {
log.default("PumpManager:\(type(of: pumpManager)) ignoring heartbeat. Last update \(lastBLEDrivenUpdate)")
log.default("PumpManager:\(type(of: pumpManager)) ignoring pumpManager heartbeat. Last ble update \(lastBLEDrivenUpdate)")
return
}
lastBLEDrivenUpdate = Date()
Expand All @@ -363,7 +369,7 @@ extension DeviceDataManager: PumpManagerDelegate {

if let manager = self.cgmManager {
self.queue.async {
self.cgmManager(manager, didUpdateWith: result)
self.processCGMResult(manager, result: result)
}
}
}
Expand Down