Skip to content

Commit 7dab897

Browse files
authored
Merge pull request #103 from LoopKit/dev
Release 2.1
2 parents 7dab51a + d367d3e commit 7dab897

File tree

14 files changed

+58
-23
lines changed

14 files changed

+58
-23
lines changed

CGMBLEKit Example/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>APPL</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>2.0</string>
18+
<string>2.1</string>
1919
<key>CFBundleVersion</key>
2020
<string>1</string>
2121
<key>LSRequiresIPhoneOS</key>

CGMBLEKit.xcodeproj/project.pbxproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@
906906
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
907907
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
908908
COPY_PHASE_STRIP = NO;
909-
CURRENT_PROJECT_VERSION = 16;
909+
CURRENT_PROJECT_VERSION = 17;
910910
DEBUG_INFORMATION_FORMAT = dwarf;
911911
ENABLE_STRICT_OBJC_MSGSEND = YES;
912912
ENABLE_TESTABILITY = YES;
@@ -966,7 +966,7 @@
966966
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
967967
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
968968
COPY_PHASE_STRIP = NO;
969-
CURRENT_PROJECT_VERSION = 16;
969+
CURRENT_PROJECT_VERSION = 17;
970970
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
971971
ENABLE_NS_ASSERTIONS = NO;
972972
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -994,12 +994,13 @@
994994
43CABE081C3506F100005705 /* Debug */ = {
995995
isa = XCBuildConfiguration;
996996
buildSettings = {
997+
APPLICATION_EXTENSION_API_ONLY = YES;
997998
CLANG_ENABLE_MODULES = YES;
998999
CODE_SIGN_IDENTITY = "iPhone Developer";
9991000
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
10001001
DEFINES_MODULE = YES;
10011002
DYLIB_COMPATIBILITY_VERSION = 1;
1002-
DYLIB_CURRENT_VERSION = 16;
1003+
DYLIB_CURRENT_VERSION = 17;
10031004
DYLIB_INSTALL_NAME_BASE = "@rpath";
10041005
INFOPLIST_FILE = CGMBLEKit/Info.plist;
10051006
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -1016,12 +1017,13 @@
10161017
43CABE091C3506F100005705 /* Release */ = {
10171018
isa = XCBuildConfiguration;
10181019
buildSettings = {
1020+
APPLICATION_EXTENSION_API_ONLY = YES;
10191021
CLANG_ENABLE_MODULES = YES;
10201022
CODE_SIGN_IDENTITY = "iPhone Developer";
10211023
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
10221024
DEFINES_MODULE = YES;
10231025
DYLIB_COMPATIBILITY_VERSION = 1;
1024-
DYLIB_CURRENT_VERSION = 16;
1026+
DYLIB_CURRENT_VERSION = 17;
10251027
DYLIB_INSTALL_NAME_BASE = "@rpath";
10261028
INFOPLIST_FILE = CGMBLEKit/Info.plist;
10271029
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";

CGMBLEKit/BluetoothManager.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,14 @@ class BluetoothManager: NSObject {
7979
}
8080
}
8181

82+
var peripheralIdentifier: UUID?
83+
8284
var peripheralManager: PeripheralManager? {
8385
didSet {
8486
oldValue?.delegate = nil
8587
peripheralManager?.delegate = self
88+
89+
peripheralIdentifier = peripheralManager?.peripheral.identifier
8690
}
8791
}
8892

@@ -108,7 +112,7 @@ class BluetoothManager: NSObject {
108112
return
109113
}
110114

111-
if let peripheralID = self.peripheral?.identifier, let peripheral = manager.retrievePeripherals(withIdentifiers: [peripheralID]).first {
115+
if let peripheralID = peripheralIdentifier, let peripheral = manager.retrievePeripherals(withIdentifiers: [peripheralID]).first {
112116
log.debug("Re-connecting to known peripheral %{public}@", peripheral.identifier.uuidString)
113117
self.peripheral = peripheral
114118
self.manager.connect(peripheral)

CGMBLEKit/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>FMWK</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>2.0</string>
18+
<string>2.1</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>

CGMBLEKit/Messages/GlucoseBackfillMessage.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,13 @@ struct GlucoseBackfillFrameBuffer {
110110
from: glucoseData.startIndex,
111111
to: glucoseData.endIndex,
112112
by: GlucoseSubMessage.size
113-
).map {
114-
return GlucoseSubMessage(data: glucoseData[$0..<$0.advanced(by: GlucoseSubMessage.size)])!
113+
).compactMap {
114+
let range = $0..<$0.advanced(by: GlucoseSubMessage.size)
115+
guard glucoseData.endIndex >= range.endIndex else {
116+
return nil
117+
}
118+
119+
return GlucoseSubMessage(data: glucoseData[range])
115120
}
116121
}
117122
}

CGMBLEKit/Messages/GlucoseRxMessage.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public struct GlucoseSubMessage: TransmitterRxMessage {
1919
public let trend: Int8
2020

2121
init?(data: Data) {
22-
guard data.count == GlucoseSubMessage.size else {
22+
guard data.count >= GlucoseSubMessage.size else {
2323
return nil
2424
}
2525

@@ -50,18 +50,18 @@ public struct GlucoseRxMessage: TransmitterRxMessage {
5050
public let glucose: GlucoseSubMessage
5151

5252
init?(data: Data) {
53-
guard data.count == 16 && data.isCRCValid else {
53+
guard data.count >= 16 && data.isCRCValid else {
5454
return nil
5555
}
5656

57-
guard data.starts(with: .glucoseRx) else {
57+
guard data.starts(with: .glucoseRx) || data.starts(with: .glucoseG6Rx) else {
5858
return nil
5959
}
6060

6161
status = data[1]
6262
sequence = data[2..<6].toInt()
6363

64-
guard let glucose = GlucoseSubMessage(data: data[6..<14]) else {
64+
guard let glucose = GlucoseSubMessage(data: data[6...]) else {
6565
return nil
6666
}
6767
self.glucose = glucose

CGMBLEKit/Opcode.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ enum Opcode: UInt8 {
1414
case authRequestRx = 0x03
1515
case authChallengeTx = 0x04
1616
case authChallengeRx = 0x05
17-
case keepAlive = 0x06
17+
case keepAlive = 0x06 // auth; setAdvertisementParametersTx for control
1818
case bondRequest = 0x07
1919

2020
// Control
2121
case disconnectTx = 0x09
22+
23+
case setAdvertisementParametersRx = 0x1c
2224

2325
case firmwareVersionTx = 0x20
2426
case firmwareVersionRx = 0x21
@@ -45,6 +47,9 @@ enum Opcode: UInt8 {
4547

4648
case transmitterVersionTx = 0x4a
4749
case transmitterVersionRx = 0x4b
50+
51+
case glucoseG6Tx = 0x4e
52+
case glucoseG6Rx = 0x4f
4853

4954
case glucoseBackfillTx = 0x50
5055
case glucoseBackfillRx = 0x51

CGMBLEKit/PeripheralManager.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class PeripheralManager: NSObject {
4545
/// Any error surfaced during the active operation
4646
private var commandError: Error?
4747

48-
unowned let central: CBCentralManager
48+
private(set) weak var central: CBCentralManager?
4949

5050
let configuration: Configuration
5151

@@ -99,7 +99,7 @@ protocol PeripheralManagerDelegate: class {
9999
// MARK: - Operation sequence management
100100
extension PeripheralManager {
101101
func configureAndRun(_ block: @escaping (_ manager: PeripheralManager) -> Void) -> (() -> Void) {
102-
return { [unowned self] in
102+
return {
103103
if !self.needsConfiguration && self.peripheral.services == nil {
104104
self.log.debug("Configured peripheral has no services. Reconfiguring…")
105105
}
@@ -168,7 +168,7 @@ extension PeripheralManager {
168168
func runCommand(timeout: TimeInterval, command: () -> Void) throws {
169169
// Prelude
170170
dispatchPrecondition(condition: .onQueue(queue))
171-
guard central.state == .poweredOn && peripheral.state == .connected else {
171+
guard central?.state == .poweredOn && peripheral.state == .connected else {
172172
throw PeripheralManagerError.notReady
173173
}
174174

CGMBLEKit/Transmitter.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,11 @@ public final class Transmitter: BluetoothManagerDelegate {
9090

9191
private let delegateQueue = DispatchQueue(label: "com.loudnate.CGMBLEKit.delegateQueue", qos: .utility)
9292

93-
public init(id: String, passiveModeEnabled: Bool = false) {
93+
public init(id: String, peripheralIdentifier: UUID? = nil, passiveModeEnabled: Bool = false) {
9494
self.id = TransmitterID(id: id)
9595
self.passiveModeEnabled = passiveModeEnabled
9696

97+
bluetoothManager.peripheralIdentifier = peripheralIdentifier
9798
bluetoothManager.delegate = self
9899
}
99100

@@ -111,6 +112,15 @@ public final class Transmitter: BluetoothManagerDelegate {
111112
return bluetoothManager.isScanning
112113
}
113114

115+
public var peripheralIdentifier: UUID? {
116+
get {
117+
return bluetoothManager.peripheralIdentifier
118+
}
119+
set {
120+
bluetoothManager.peripheralIdentifier = newValue
121+
}
122+
}
123+
114124
public var stayConnected: Bool {
115125
get {
116126
return bluetoothManager.stayConnected
@@ -220,7 +230,7 @@ public final class Transmitter: BluetoothManagerDelegate {
220230
guard response.count > 0 else { return }
221231

222232
switch Opcode(rawValue: response[0]) {
223-
case .glucoseRx?:
233+
case .glucoseRx?, .glucoseG6Rx?:
224234
if let glucoseMessage = GlucoseRxMessage(data: response),
225235
let timeMessage = lastTimeMessage,
226236
let activationDate = activationDate

CGMBLEKitTests/GlucoseBackfillMessageTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,12 @@ class GlucoseBackfillMessageTests: XCTestCase {
6262
XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[4].state))
6363
XCTAssertEqual(-08, messages[4].trend)
6464
}
65+
66+
func testMalformedBackfill() {
67+
var buffer = GlucoseBackfillFrameBuffer(identifier: 0)
68+
buffer.append(Data(hexadecimalString: "0100bc460000b7ff52008b0006eee30053008500")!)
69+
buffer.append(Data(hexadecimalString: "020006eb0f025300800006ee3a0353007e0006")!)
70+
71+
XCTAssertEqual(3, buffer.glucose.count)
72+
}
6573
}

0 commit comments

Comments
 (0)