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 xDripG5.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "xDripG5"
s.version = "0.2.2"
s.version = "0.3.0"
s.summary = "An interface for communicating with the G5 glucose transmitter over Bluetooth."

s.description = <<-DESC
Expand Down
12 changes: 8 additions & 4 deletions xDripG5.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
434FD68A1C3523A7000B4E2E /* CommonCrypto.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4337D7EA1C351B0B0016851F /* CommonCrypto.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
43CABDF71C3506F100005705 /* xDripG5.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CABDF61C3506F100005705 /* xDripG5.h */; settings = {ATTRIBUTES = (Public, ); }; };
43CABDFE1C3506F100005705 /* xDripG5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43CABDF31C3506F100005705 /* xDripG5.framework */; };
43CABE031C3506F100005705 /* xDripG5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE021C3506F100005705 /* xDripG5Tests.swift */; };
43CABE121C350B2800005705 /* BluetoothManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE0E1C350B2800005705 /* BluetoothManager.swift */; };
43CABE131C350B2800005705 /* BluetoothServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE0F1C350B2800005705 /* BluetoothServices.swift */; };
43CABE141C350B2800005705 /* NSData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE101C350B2800005705 /* NSData.swift */; };
Expand All @@ -29,6 +28,8 @@
43CABE2C1C350B3D00005705 /* TransmitterMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE201C350B3D00005705 /* TransmitterMessage.swift */; };
43CABE2D1C350B3D00005705 /* TransmitterTimeRxMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE211C350B3D00005705 /* TransmitterTimeRxMessage.swift */; };
43CABE2E1C350B3D00005705 /* TransmitterTimeTxMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CABE221C350B3D00005705 /* TransmitterTimeTxMessage.swift */; };
43DC87C01C8B509B005BC30D /* NSData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DC87BF1C8B509B005BC30D /* NSData.swift */; };
43DC87C21C8B520F005BC30D /* GlucoseRxMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DC87C11C8B520F005BC30D /* GlucoseRxMessageTests.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -60,7 +61,6 @@
43CABDF61C3506F100005705 /* xDripG5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xDripG5.h; sourceTree = "<group>"; };
43CABDF81C3506F100005705 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
43CABDFD1C3506F100005705 /* xDripG5Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = xDripG5Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
43CABE021C3506F100005705 /* xDripG5Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = xDripG5Tests.swift; sourceTree = "<group>"; };
43CABE041C3506F100005705 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
43CABE0E1C350B2800005705 /* BluetoothManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BluetoothManager.swift; sourceTree = "<group>"; };
43CABE0F1C350B2800005705 /* BluetoothServices.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BluetoothServices.swift; sourceTree = "<group>"; };
Expand All @@ -78,6 +78,8 @@
43CABE201C350B3D00005705 /* TransmitterMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransmitterMessage.swift; sourceTree = "<group>"; };
43CABE211C350B3D00005705 /* TransmitterTimeRxMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransmitterTimeRxMessage.swift; sourceTree = "<group>"; };
43CABE221C350B3D00005705 /* TransmitterTimeTxMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransmitterTimeTxMessage.swift; sourceTree = "<group>"; };
43DC87BF1C8B509B005BC30D /* NSData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSData.swift; sourceTree = "<group>"; };
43DC87C11C8B520F005BC30D /* GlucoseRxMessageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseRxMessageTests.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -137,8 +139,9 @@
43CABE011C3506F100005705 /* xDripG5Tests */ = {
isa = PBXGroup;
children = (
43CABE021C3506F100005705 /* xDripG5Tests.swift */,
43CABE041C3506F100005705 /* Info.plist */,
43DC87C11C8B520F005BC30D /* GlucoseRxMessageTests.swift */,
43DC87BF1C8B509B005BC30D /* NSData.swift */,
);
path = xDripG5Tests;
sourceTree = "<group>";
Expand Down Expand Up @@ -294,7 +297,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
43CABE031C3506F100005705 /* xDripG5Tests.swift in Sources */,
43DC87C01C8B509B005BC30D /* NSData.swift in Sources */,
43DC87C21C8B520F005BC30D /* GlucoseRxMessageTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
2 changes: 1 addition & 1 deletion xDripG5/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>0.2.2</string>
<string>0.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
Expand Down
12 changes: 8 additions & 4 deletions xDripG5/Messages/GlucoseRxMessage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import Foundation

public struct GlucoseRxMessage: TransmitterRxMessage {
static let opcode: UInt8 = 0x31
let glucoseIsDisplayOnly: Bool = false // TODO
let status: UInt8
let sequence: UInt32
public let status: UInt8
public let sequence: UInt32
public let timestamp: UInt32
public let glucoseIsDisplayOnly: Bool
public let glucose: UInt16
public let state: UInt8
public let trend: Int8
Expand All @@ -25,7 +25,11 @@ public struct GlucoseRxMessage: TransmitterRxMessage {
status = data[1]
sequence = data[2...5]
timestamp = data[6...9]
glucose = data[10...11] & 0xfff

let glucoseBytes: UInt16 = data[10...11]
glucoseIsDisplayOnly = (glucoseBytes & 0xf000) > 0
glucose = glucoseBytes & 0xfff

state = data[12]
trend = data[13]
} else {
Expand Down
48 changes: 0 additions & 48 deletions xDripG5/NSData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,52 +61,4 @@ public extension NSData {
subscript(range: Range<Int>) -> NSData {
return subdataWithRange(NSRange(range))
}

public convenience init?(hexadecimalString: String) {
if let
chars = hexadecimalString.cStringUsingEncoding(NSUTF8StringEncoding),
mutableData = NSMutableData(capacity: chars.count / 2)
{
for i in 0..<chars.count / 2 {
var num: UInt8 = 0
var multi: UInt8 = 16

for j in 0..<2 {
let c = chars[i * 2 + j]
var offset: UInt8

switch c {
case 48...57: // '0'-'9'
offset = 48
case 65...70: // 'A'-'F'
offset = 65 - 10 // 10 since 'A' is 10, not 0
case 97...102: // 'a'-'f'
offset = 97 - 10 // 10 since 'a' is 10, not 0
default:
return nil
}

num += (UInt8(c) - offset) * multi
multi = 1
}
mutableData.appendBytes(&num, length: 1)
}

self.init(data: mutableData)
} else {
return nil
}
}

public var hexadecimalString: String {
let bytesCollection = UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(bytes), count: length)

let string = NSMutableString(capacity: length * 2)

for byte in bytesCollection {
string.appendFormat("%02x", byte)
}

return string as String
}
}
54 changes: 54 additions & 0 deletions xDripG5Tests/GlucoseRxMessageTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//
// GlucoseRxMessageTests.swift
// xDripG5
//
// Created by Nathan Racklyeft on 3/5/16.
// Copyright © 2016 Nathan Racklyeft. All rights reserved.
//

import XCTest
@testable import xDripG5


class GlucoseRxMessageTests: XCTestCase {

func testMessageData() {
let data = NSData(hexadecimalString: "3100680a00008a715700cc0006ffc42a")!
let message = GlucoseRxMessage(data: data)!

XCTAssertEqual(0, message.status)
XCTAssertEqual(2664, message.sequence)
XCTAssertEqual(5730698, message.timestamp)
XCTAssertFalse(message.glucoseIsDisplayOnly)
XCTAssertEqual(204, message.glucose)
XCTAssertEqual(6, message.state)
XCTAssertEqual(-1, message.trend)
}

func testNegativeTrend() {
let data = NSData(hexadecimalString: "31006f0a0000be7957007a0006e4818d")!
let message = GlucoseRxMessage(data: data)!

XCTAssertEqual(0, message.status)
XCTAssertEqual(2671, message.sequence)
XCTAssertEqual(5732798, message.timestamp)
XCTAssertFalse(message.glucoseIsDisplayOnly)
XCTAssertEqual(122, message.glucose)
XCTAssertEqual(6, message.state)
XCTAssertEqual(-28, message.trend)
}

func testDisplayOnly() {
let data = NSData(hexadecimalString: "3100700a0000f17a5700584006e3cee9")!
let message = GlucoseRxMessage(data: data)!

XCTAssertEqual(0, message.status)
XCTAssertEqual(2672, message.sequence)
XCTAssertEqual(5733105, message.timestamp)
XCTAssertTrue(message.glucoseIsDisplayOnly)
XCTAssertEqual(88, message.glucose)
XCTAssertEqual(6, message.state)
XCTAssertEqual(-29, message.trend)
}

}
60 changes: 60 additions & 0 deletions xDripG5Tests/NSData.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// NSData.swift
// xDripG5
//
// Created by Nathan Racklyeft on 3/5/16.
// Copyright © 2016 Nathan Racklyeft. All rights reserved.
//

import Foundation


extension NSData {
public convenience init?(hexadecimalString: String) {
if let
chars = hexadecimalString.cStringUsingEncoding(NSUTF8StringEncoding),
mutableData = NSMutableData(capacity: chars.count / 2)
{
for i in 0..<chars.count / 2 {
var num: UInt8 = 0
var multi: UInt8 = 16

for j in 0..<2 {
let c = chars[i * 2 + j]
var offset: UInt8

switch c {
case 48...57: // '0'-'9'
offset = 48
case 65...70: // 'A'-'F'
offset = 65 - 10 // 10 since 'A' is 10, not 0
case 97...102: // 'a'-'f'
offset = 97 - 10 // 10 since 'a' is 10, not 0
default:
return nil
}

num += (UInt8(c) - offset) * multi
multi = 1
}
mutableData.appendBytes(&num, length: 1)
}

self.init(data: mutableData)
} else {
return nil
}
}

public var hexadecimalString: String {
let bytesCollection = UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(bytes), count: length)

let string = NSMutableString(capacity: length * 2)

for byte in bytesCollection {
string.appendFormat("%02x", byte)
}

return string as String
}
}
8 changes: 0 additions & 8 deletions xDripG5Tests/fixtures.txt

This file was deleted.

37 changes: 0 additions & 37 deletions xDripG5Tests/xDripG5Tests.swift

This file was deleted.