Skip to content

Commit 859b5af

Browse files
authored
Merge pull request #405 from ps2/dev
Release 2.0.2
2 parents cbf3bd8 + 0589062 commit 859b5af

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+555
-85
lines changed

Crypto/Info.plist

+1-1
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.1</string>
18+
<string>2.0.2</string>
1919
<key>CFBundleVersion</key>
2020
<string>$(CURRENT_PROJECT_VERSION)</string>
2121
<key>NSPrincipalClass</key>

MinimedKit/BasalSchedule.swift

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extension BasalSchedule {
4848
if let entry = BasalScheduleEntry(
4949
index: tuple.index,
5050
rawValue: rawValue[beginOfRange..<endOfRange]
51-
) {
51+
) {
5252
if let last = entries.last, last.timeOffset >= entry.timeOffset {
5353
// Stop if the new timeOffset isn't greater than the last one
5454
break
@@ -77,6 +77,11 @@ extension BasalSchedule {
7777
byteIndex += rawEntry.count
7878
}
7979

80+
// Send the special "empty" code to clear a schedule
81+
if entries.count == 0 {
82+
buffer[2] = 0x3f
83+
}
84+
8085
return buffer
8186
}
8287
}
@@ -97,6 +102,7 @@ private extension BasalScheduleEntry {
97102
let offsetMinutes = Double(rawValue.last!) * 30
98103
let timeOffset = TimeInterval(minutes: offsetMinutes)
99104

105+
// 0x3f *30*60 denotes a stop value
100106
guard timeOffset < .hours(24) else {
101107
return nil
102108
}

MinimedKit/BatteryChemistryType.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public enum BatteryChemistryType: Int, CustomStringConvertible {
3333
public var minVoltage: Double {
3434
switch self {
3535
case .alkaline:
36-
return 1.20
36+
return 1.18
3737
case .lithium:
3838
return 1.32
3939
}

MinimedKit/Info.plist

+1-1
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.1</string>
18+
<string>2.0.2</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>

MinimedKit/MessageType.swift

+26-15
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,30 @@ public enum MessageType: UInt8 {
1818
case errorResponse = 0x15
1919
case writeGlucoseHistoryTimestamp = 0x28
2020

21-
case readRemoteControlID = 0x2e // Refused by x23 pumps
21+
case setBasalProfileA = 0x30 // CMD_SET_A_PROFILE
22+
case setBasalProfileB = 0x31 // CMD_SET_B_PROFILE
2223

2324
case changeTime = 0x40
25+
case setMaxBolus = 0x41 // CMD_SET_MAX_BOLUS
2426
case bolus = 0x42
2527

2628
case PumpExperiment_OP67 = 0x43
2729
case PumpExperiment_OP68 = 0x44
28-
case PumpExperiment_OP69 = 0x45
30+
case PumpExperiment_OP69 = 0x45 // CMD_SET_VAR_BOLUS_ENABLE
2931

3032
case selectBasalProfile = 0x4a
3133

3234
case changeTempBasal = 0x4c
3335

3436
case PumpExperiment_OP80 = 0x50
35-
case PumpExperiment_OP81 = 0x51
36-
case PumpExperiment_OP82 = 0x52
37-
case PumpExperiment_OP83 = 0x53
38-
case PumpExperiment_OP84 = 0x54
39-
case PumpExperiment_OP85 = 0x55
37+
case setRemoteControlID = 0x51 // CMD_SET_RF_REMOTE_ID
38+
case PumpExperiment_OP82 = 0x52 // CMD_SET_BLOCK_ENABLE
39+
case setLanguage = 0x53
40+
case PumpExperiment_OP84 = 0x54 // CMD_SET_ALERT_TYPE
41+
case PumpExperiment_OP85 = 0x55 // CMD_SET_PATTERNS_ENABLE
4042
case PumpExperiment_OP86 = 0x56
41-
case PumpExperiment_OP87 = 0x57
42-
case PumpExperiment_OP88 = 0x58
43+
case setRemoteControlEnabled = 0x57 // CMD_SET_RF_ENABLE
44+
case PumpExperiment_OP88 = 0x58 // CMD_SET_INSULIN_ACTION_TYPE
4345
case PumpExperiment_OP89 = 0x59
4446
case PumpExperiment_OP90 = 0x5a
4547

@@ -49,16 +51,23 @@ public enum MessageType: UInt8 {
4951

5052
case powerOn = 0x5d
5153

52-
case PumpExperiment_OP97 = 0x61
53-
case PumpExperiment_OP98 = 0x62
54-
case PumpExperiment_OP99 = 0x63
55-
case PumpExperiment_O100 = 0x64
56-
case PumpExperiment_O101 = 0x65
57-
case PumpExperiment_O103 = 0x67
54+
case setBolusWizardEnabled1 = 0x61
55+
case setBolusWizardEnabled2 = 0x62
56+
case setBolusWizardEnabled3 = 0x63
57+
case setBolusWizardEnabled4 = 0x64
58+
case setBolusWizardEnabled5 = 0x65
59+
case setAlarmClockEnable = 0x67
60+
61+
case setMaxBasalRate = 0x6e // CMD_SET_MAX_BASAL
62+
case setBasalProfileStandard = 0x6f // CMD_SET_STD_PROFILE
5863

5964
case readTime = 0x70
6065
case getBattery = 0x72
6166
case readRemainingInsulin = 0x73
67+
case readFirmwareVersion = 0x74
68+
case readErrorStatus = 0x75
69+
case readRemoteControlIDs = 0x76 // CMD_READ_REMOTE_CTRL_IDS
70+
6271
case getHistoryPage = 0x80
6372
case getPumpModel = 0x8d
6473
case readProfileSTD512 = 0x92
@@ -130,6 +139,8 @@ public enum MessageType: UInt8 {
130139
return ReadOtherDevicesIDsMessageBody.self
131140
case .readOtherDevicesStatus:
132141
return ReadOtherDevicesStatusMessageBody.self
142+
case .readRemoteControlIDs:
143+
return ReadRemoteControlIDsMessageBody.self
133144
default:
134145
return UnknownMessageBody.self
135146
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// ChangeMaxBasalRateMessageBody.swift
3+
// MinimedKit
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
11+
public class ChangeMaxBasalRateMessageBody: CarelinkLongMessageBody {
12+
13+
static let multiplier: Double = 40
14+
15+
public convenience init?(maxBasalUnitsPerHour: Double) {
16+
guard maxBasalUnitsPerHour >= 0 && maxBasalUnitsPerHour <= 35 else {
17+
return nil
18+
}
19+
20+
let ticks = UInt16(maxBasalUnitsPerHour * type(of: self).multiplier)
21+
var data = Data(bytes: [UInt8(clamping: ticks.bitWidth / 8)])
22+
data.appendBigEndian(ticks)
23+
24+
self.init(rxData: data)
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// ChangeMaxBolusMessageBody.swift
3+
// MinimedKit
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
11+
public class ChangeMaxBolusMessageBody: CarelinkLongMessageBody {
12+
13+
static let multiplier: Double = 10
14+
15+
public convenience init?(maxBolusUnits: Double) {
16+
guard maxBolusUnits >= 0 && maxBolusUnits <= 25 else {
17+
return nil
18+
}
19+
20+
let ticks = UInt8(maxBolusUnits * type(of: self).multiplier)
21+
var data = Data(bytes: [UInt8(clamping: ticks.bitWidth / 8)])
22+
data.appendBigEndian(ticks)
23+
24+
self.init(rxData: data)
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// ChangeRemoteControlIDMessageBody.swift
3+
// MinimedKit
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
11+
public class ChangeRemoteControlIDMessageBody: CarelinkLongMessageBody {
12+
public convenience init?(id: Data? = nil, index: Int) {
13+
guard index < 3 else {
14+
return nil
15+
}
16+
17+
var rxData = Data(repeating: 0x2d, count: 8) // 2d signifies a deletion
18+
rxData[0] = 0x07 // length
19+
rxData[1] = UInt8(clamping: index)
20+
21+
if let id = id {
22+
for (index, byte) in id.enumerated() {
23+
rxData[2 + index] = 0b00110000 + byte
24+
}
25+
}
26+
27+
self.init(rxData: rxData)
28+
}
29+
30+
}

MinimedKit/Messages/ReadOtherDevicesIDsMessageBody.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010

1111
public class ReadOtherDevicesIDsMessageBody: CarelinkLongMessageBody {
1212

13-
let ids: [Data]
13+
public let ids: [Data]
1414

1515
public required init?(rxData: Data) {
1616
guard rxData.count == type(of: self).length else {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// ReadRemoteControlIDsMessageBody.swift
3+
// MinimedKit
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
private let idSize = 6
11+
12+
public class ReadRemoteControlIDsMessageBody: CarelinkLongMessageBody {
13+
public let ids: [Data]
14+
15+
public required init?(rxData: Data) {
16+
guard rxData.count == type(of: self).length else {
17+
return nil
18+
}
19+
20+
var ids: [Data] = []
21+
22+
remotes: for index in stride(from: 0, to: 3, by: 1) {
23+
let start = (index * idSize + 1)
24+
let end = start + idSize
25+
26+
var remoteID = Data(capacity: idSize)
27+
28+
for byte in rxData[start..<end] {
29+
let isEnabled = (byte & 0b00010000) == 0b00010000
30+
guard isEnabled else {
31+
continue remotes
32+
}
33+
34+
remoteID.append(byte & 0xf)
35+
}
36+
37+
ids.append(remoteID)
38+
}
39+
40+
self.ids = ids
41+
42+
super.init(rxData: rxData)
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// SetRemoteControlEnabledMessageBody.swift
3+
// MinimedKit
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import Foundation
9+
10+
11+
public class SetRemoteControlEnabledMessageBody: CarelinkLongMessageBody {
12+
public convenience init(enabled: Bool) {
13+
self.init(rxData: Data(bytes: [1, enabled ? 1 : 0]))!
14+
}
15+
}

MinimedKitTests/BasalScheduleTests.swift

+9
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,13 @@ class BasalScheduleTests: XCTestCase {
6464

6565
XCTAssertEqual(3, frames.count)
6666
}
67+
68+
func testEmptySchedule() {
69+
let emptyData = Data(hexadecimalString: "00003f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!
70+
71+
let profile = BasalSchedule(rawValue: emptyData)
72+
XCTAssertNil(profile)
73+
74+
XCTAssertEqual(emptyData, BasalSchedule(entries: []).rawValue)
75+
}
6776
}

MinimedKitTests/Info.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>BNDL</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>2.0.1</string>
18+
<string>2.0.2</string>
1919
<key>CFBundleSignature</key>
2020
<string>????</string>
2121
<key>CFBundleVersion</key>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// ChangeMaxBasalRateMessageBodyTests.swift
3+
// MinimedKitTests
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import XCTest
9+
@testable import MinimedKit
10+
11+
class ChangeMaxBasalRateMessageBodyTests: XCTestCase {
12+
13+
func testMaxBasalRate() {
14+
var body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 6.4)!
15+
16+
XCTAssertEqual(Data(hexadecimalString: "0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString)
17+
18+
body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 4.0)!
19+
20+
XCTAssertEqual(Data(hexadecimalString: "0200A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString)
21+
}
22+
23+
func testMaxBasalRateRounded() {
24+
let body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 9.115)!
25+
26+
XCTAssertEqual(Data(hexadecimalString: "02016c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString)
27+
28+
29+
}
30+
31+
func testMaxBasalRateOutOfRange() {
32+
XCTAssertNil(ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: -1))
33+
XCTAssertNil(ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 36))
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// ChangeMaxBolusMessageBodyTests.swift
3+
// MinimedKitTests
4+
//
5+
// Copyright © 2018 Pete Schwamb. All rights reserved.
6+
//
7+
8+
import XCTest
9+
@testable import MinimedKit
10+
11+
class ChangeMaxBolusMessageBodyTests: XCTestCase {
12+
13+
func testMaxBolus() {
14+
let body = ChangeMaxBolusMessageBody(maxBolusUnits: 6.4)!
15+
16+
XCTAssertEqual(Data(hexadecimalString: "0140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString)
17+
}
18+
19+
func testMaxBolusRounded() {
20+
let body = ChangeMaxBolusMessageBody(maxBolusUnits: 2.25)!
21+
22+
XCTAssertEqual(Data(hexadecimalString: "0116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString)
23+
}
24+
25+
func testMaxBolusOutOfRange() {
26+
XCTAssertNil(ChangeMaxBolusMessageBody(maxBolusUnits: -1))
27+
XCTAssertNil(ChangeMaxBolusMessageBody(maxBolusUnits: 26))
28+
}
29+
30+
}

0 commit comments

Comments
 (0)