Skip to content

Commit 46047ed

Browse files
authored
Fix calibration decoding, and lagged backfill processing (LoopKit#35)
1 parent 67c5523 commit 46047ed

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

G7SensorKit/G7CGMManager/G7BackfillMessage.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,19 @@ public struct G7BackfillMessage: Equatable {
3232
return nil
3333
}
3434

35-
timestamp = data[0..<4].toInt()
35+
36+
timestamp = data[0..<3].toInt()
3637

3738
let glucoseBytes = data[4..<6].to(UInt16.self)
3839

3940
if glucoseBytes != 0xffff {
4041
glucose = glucoseBytes & 0xfff
41-
glucoseIsDisplayOnly = (glucoseBytes & 0xf000) > 0
4242
} else {
4343
glucose = nil
44-
glucoseIsDisplayOnly = false
4544
}
4645

46+
glucoseIsDisplayOnly = data[7] & 0x10 != 0
47+
4748
algorithmState = AlgorithmState(rawValue: data[6])
4849

4950
if data[8] == 0x7f {

G7SensorKit/G7CGMManager/G7Sensor.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ public final class G7Sensor: G7BluetoothManagerDelegate {
195195
func peripheralDidDisconnect(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, wasRemoteDisconnect: Bool) {
196196
if let sensorID = sensorID, sensorID == peripheralManager.peripheral.name {
197197

198+
// Sometimes we do not receive the backfillFinished message before disconnect
199+
flushBackfillBuffer()
200+
198201
let suspectedEndOfSession: Bool
199202

200203
self.log.info("Sensor disconnected: wasRemoteDisconnect:%{public}@", String(describing: wasRemoteDisconnect))
@@ -249,18 +252,23 @@ public final class G7Sensor: G7BluetoothManagerDelegate {
249252
}
250253
}
251254
case .backfillFinished:
252-
if backfillBuffer.count > 0 {
253-
delegateQueue.async {
254-
self.delegate?.sensor(self, didReadBackfill: self.backfillBuffer)
255-
self.backfillBuffer = []
256-
}
257-
}
255+
flushBackfillBuffer()
258256
default:
259257
self.delegate?.sensor(self, logComms: response.hexadecimalString)
260258
break
261259
}
262260
}
263261

262+
func flushBackfillBuffer() {
263+
if backfillBuffer.count > 0 {
264+
let backfill = backfillBuffer
265+
self.backfillBuffer = []
266+
delegateQueue.async {
267+
self.delegate?.sensor(self, didReadBackfill: backfill)
268+
}
269+
}
270+
}
271+
264272
func bluetoothManager(_ manager: G7BluetoothManager, didReceiveBackfillResponse response: Data) {
265273

266274
log.debug("Received backfill response: %{public}@", response.hexadecimalString)

G7SensorKitTests/G7GlucoseMessageTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,23 @@ final class G7GlucoseMessageTests: XCTestCase {
131131
let data = Data(hexadecimalString: "cf5802008f00060f10")!
132132
let message = G7BackfillMessage(data: data)!
133133
XCTAssertEqual(153807, message.timestamp)
134+
XCTAssertEqual(143, message.glucose)
135+
XCTAssertEqual(.known(.ok), message.algorithmState)
136+
XCTAssertNil(message.condition)
137+
XCTAssertEqual(false, message.glucoseIsDisplayOnly)
138+
XCTAssertEqual(true, message.hasReliableGlucose)
139+
}
140+
141+
func testBackfillTimestampWithHighByte() {
142+
let data = Data(hexadecimalString: "f20e0d00ba00060ffb")!
143+
let message = G7BackfillMessage(data: data)!
144+
XCTAssertEqual(855794, message.timestamp)
145+
}
146+
147+
func testBackfillCalibration() {
148+
let data = Data(hexadecimalString: "f63d00008500061efe")!
149+
let message = G7BackfillMessage(data: data)!
150+
XCTAssertEqual(true, message.glucoseIsDisplayOnly)
134151
}
135152

136153
}

0 commit comments

Comments
 (0)