From 5481bd0014ff09ccaa4cd52c60581b279389fd38 Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Mon, 14 Apr 2025 12:47:02 -0500 Subject: [PATCH] Fix calibration decoding, and lagged backfill processing --- .../G7CGMManager/G7BackfillMessage.swift | 7 ++++--- G7SensorKit/G7CGMManager/G7Sensor.swift | 20 +++++++++++++------ G7SensorKitTests/G7GlucoseMessageTests.swift | 17 ++++++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/G7SensorKit/G7CGMManager/G7BackfillMessage.swift b/G7SensorKit/G7CGMManager/G7BackfillMessage.swift index 2658cb4..90cc3eb 100644 --- a/G7SensorKit/G7CGMManager/G7BackfillMessage.swift +++ b/G7SensorKit/G7CGMManager/G7BackfillMessage.swift @@ -32,18 +32,19 @@ public struct G7BackfillMessage: Equatable { return nil } - timestamp = data[0..<4].toInt() + + timestamp = data[0..<3].toInt() let glucoseBytes = data[4..<6].to(UInt16.self) if glucoseBytes != 0xffff { glucose = glucoseBytes & 0xfff - glucoseIsDisplayOnly = (glucoseBytes & 0xf000) > 0 } else { glucose = nil - glucoseIsDisplayOnly = false } + glucoseIsDisplayOnly = data[7] & 0x10 != 0 + algorithmState = AlgorithmState(rawValue: data[6]) if data[8] == 0x7f { diff --git a/G7SensorKit/G7CGMManager/G7Sensor.swift b/G7SensorKit/G7CGMManager/G7Sensor.swift index ea215d1..aa88883 100644 --- a/G7SensorKit/G7CGMManager/G7Sensor.swift +++ b/G7SensorKit/G7CGMManager/G7Sensor.swift @@ -195,6 +195,9 @@ public final class G7Sensor: G7BluetoothManagerDelegate { func peripheralDidDisconnect(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, wasRemoteDisconnect: Bool) { if let sensorID = sensorID, sensorID == peripheralManager.peripheral.name { + // Sometimes we do not receive the backfillFinished message before disconnect + flushBackfillBuffer() + let suspectedEndOfSession: Bool self.log.info("Sensor disconnected: wasRemoteDisconnect:%{public}@", String(describing: wasRemoteDisconnect)) @@ -249,18 +252,23 @@ public final class G7Sensor: G7BluetoothManagerDelegate { } } case .backfillFinished: - if backfillBuffer.count > 0 { - delegateQueue.async { - self.delegate?.sensor(self, didReadBackfill: self.backfillBuffer) - self.backfillBuffer = [] - } - } + flushBackfillBuffer() default: self.delegate?.sensor(self, logComms: response.hexadecimalString) break } } + func flushBackfillBuffer() { + if backfillBuffer.count > 0 { + let backfill = backfillBuffer + self.backfillBuffer = [] + delegateQueue.async { + self.delegate?.sensor(self, didReadBackfill: backfill) + } + } + } + func bluetoothManager(_ manager: G7BluetoothManager, didReceiveBackfillResponse response: Data) { log.debug("Received backfill response: %{public}@", response.hexadecimalString) diff --git a/G7SensorKitTests/G7GlucoseMessageTests.swift b/G7SensorKitTests/G7GlucoseMessageTests.swift index 739f7e0..5d61445 100644 --- a/G7SensorKitTests/G7GlucoseMessageTests.swift +++ b/G7SensorKitTests/G7GlucoseMessageTests.swift @@ -131,6 +131,23 @@ final class G7GlucoseMessageTests: XCTestCase { let data = Data(hexadecimalString: "cf5802008f00060f10")! let message = G7BackfillMessage(data: data)! XCTAssertEqual(153807, message.timestamp) + XCTAssertEqual(143, message.glucose) + XCTAssertEqual(.known(.ok), message.algorithmState) + XCTAssertNil(message.condition) + XCTAssertEqual(false, message.glucoseIsDisplayOnly) + XCTAssertEqual(true, message.hasReliableGlucose) + } + + func testBackfillTimestampWithHighByte() { + let data = Data(hexadecimalString: "f20e0d00ba00060ffb")! + let message = G7BackfillMessage(data: data)! + XCTAssertEqual(855794, message.timestamp) + } + + func testBackfillCalibration() { + let data = Data(hexadecimalString: "f63d00008500061efe")! + let message = G7BackfillMessage(data: data)! + XCTAssertEqual(true, message.glucoseIsDisplayOnly) } }