diff --git a/Crypto/Info.plist b/Crypto/Info.plist index 0e27f5f6d..e13d2efa7 100644 --- a/Crypto/Info.plist +++ b/Crypto/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/MinimedKit/BasalSchedule.swift b/MinimedKit/BasalSchedule.swift index 28ad48219..4af810e65 100644 --- a/MinimedKit/BasalSchedule.swift +++ b/MinimedKit/BasalSchedule.swift @@ -48,7 +48,7 @@ extension BasalSchedule { if let entry = BasalScheduleEntry( index: tuple.index, rawValue: rawValue[beginOfRange..= entry.timeOffset { // Stop if the new timeOffset isn't greater than the last one break @@ -77,6 +77,11 @@ extension BasalSchedule { byteIndex += rawEntry.count } + // Send the special "empty" code to clear a schedule + if entries.count == 0 { + buffer[2] = 0x3f + } + return buffer } } @@ -97,6 +102,7 @@ private extension BasalScheduleEntry { let offsetMinutes = Double(rawValue.last!) * 30 let timeOffset = TimeInterval(minutes: offsetMinutes) + // 0x3f *30*60 denotes a stop value guard timeOffset < .hours(24) else { return nil } diff --git a/MinimedKit/BatteryChemistryType.swift b/MinimedKit/BatteryChemistryType.swift index 30a047835..a797e7571 100644 --- a/MinimedKit/BatteryChemistryType.swift +++ b/MinimedKit/BatteryChemistryType.swift @@ -33,7 +33,7 @@ public enum BatteryChemistryType: Int, CustomStringConvertible { public var minVoltage: Double { switch self { case .alkaline: - return 1.20 + return 1.18 case .lithium: return 1.32 } diff --git a/MinimedKit/Info.plist b/MinimedKit/Info.plist index 783e22ec8..a16c895d4 100644 --- a/MinimedKit/Info.plist +++ b/MinimedKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/MinimedKit/MessageType.swift b/MinimedKit/MessageType.swift index df3580e03..95b186b8a 100644 --- a/MinimedKit/MessageType.swift +++ b/MinimedKit/MessageType.swift @@ -18,28 +18,30 @@ public enum MessageType: UInt8 { case errorResponse = 0x15 case writeGlucoseHistoryTimestamp = 0x28 - case readRemoteControlID = 0x2e // Refused by x23 pumps + case setBasalProfileA = 0x30 // CMD_SET_A_PROFILE + case setBasalProfileB = 0x31 // CMD_SET_B_PROFILE case changeTime = 0x40 + case setMaxBolus = 0x41 // CMD_SET_MAX_BOLUS case bolus = 0x42 case PumpExperiment_OP67 = 0x43 case PumpExperiment_OP68 = 0x44 - case PumpExperiment_OP69 = 0x45 + case PumpExperiment_OP69 = 0x45 // CMD_SET_VAR_BOLUS_ENABLE case selectBasalProfile = 0x4a case changeTempBasal = 0x4c case PumpExperiment_OP80 = 0x50 - case PumpExperiment_OP81 = 0x51 - case PumpExperiment_OP82 = 0x52 - case PumpExperiment_OP83 = 0x53 - case PumpExperiment_OP84 = 0x54 - case PumpExperiment_OP85 = 0x55 + case setRemoteControlID = 0x51 // CMD_SET_RF_REMOTE_ID + case PumpExperiment_OP82 = 0x52 // CMD_SET_BLOCK_ENABLE + case setLanguage = 0x53 + case PumpExperiment_OP84 = 0x54 // CMD_SET_ALERT_TYPE + case PumpExperiment_OP85 = 0x55 // CMD_SET_PATTERNS_ENABLE case PumpExperiment_OP86 = 0x56 - case PumpExperiment_OP87 = 0x57 - case PumpExperiment_OP88 = 0x58 + case setRemoteControlEnabled = 0x57 // CMD_SET_RF_ENABLE + case PumpExperiment_OP88 = 0x58 // CMD_SET_INSULIN_ACTION_TYPE case PumpExperiment_OP89 = 0x59 case PumpExperiment_OP90 = 0x5a @@ -49,16 +51,23 @@ public enum MessageType: UInt8 { case powerOn = 0x5d - case PumpExperiment_OP97 = 0x61 - case PumpExperiment_OP98 = 0x62 - case PumpExperiment_OP99 = 0x63 - case PumpExperiment_O100 = 0x64 - case PumpExperiment_O101 = 0x65 - case PumpExperiment_O103 = 0x67 + case setBolusWizardEnabled1 = 0x61 + case setBolusWizardEnabled2 = 0x62 + case setBolusWizardEnabled3 = 0x63 + case setBolusWizardEnabled4 = 0x64 + case setBolusWizardEnabled5 = 0x65 + case setAlarmClockEnable = 0x67 + + case setMaxBasalRate = 0x6e // CMD_SET_MAX_BASAL + case setBasalProfileStandard = 0x6f // CMD_SET_STD_PROFILE case readTime = 0x70 case getBattery = 0x72 case readRemainingInsulin = 0x73 + case readFirmwareVersion = 0x74 + case readErrorStatus = 0x75 + case readRemoteControlIDs = 0x76 // CMD_READ_REMOTE_CTRL_IDS + case getHistoryPage = 0x80 case getPumpModel = 0x8d case readProfileSTD512 = 0x92 @@ -130,6 +139,8 @@ public enum MessageType: UInt8 { return ReadOtherDevicesIDsMessageBody.self case .readOtherDevicesStatus: return ReadOtherDevicesStatusMessageBody.self + case .readRemoteControlIDs: + return ReadRemoteControlIDsMessageBody.self default: return UnknownMessageBody.self } diff --git a/MinimedKit/Messages/ChangeMaxBasalRateMessageBody.swift b/MinimedKit/Messages/ChangeMaxBasalRateMessageBody.swift new file mode 100644 index 000000000..108b074d1 --- /dev/null +++ b/MinimedKit/Messages/ChangeMaxBasalRateMessageBody.swift @@ -0,0 +1,27 @@ +// +// ChangeMaxBasalRateMessageBody.swift +// MinimedKit +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + + +public class ChangeMaxBasalRateMessageBody: CarelinkLongMessageBody { + + static let multiplier: Double = 40 + + public convenience init?(maxBasalUnitsPerHour: Double) { + guard maxBasalUnitsPerHour >= 0 && maxBasalUnitsPerHour <= 35 else { + return nil + } + + let ticks = UInt16(maxBasalUnitsPerHour * type(of: self).multiplier) + var data = Data(bytes: [UInt8(clamping: ticks.bitWidth / 8)]) + data.appendBigEndian(ticks) + + self.init(rxData: data) + } + +} diff --git a/MinimedKit/Messages/ChangeMaxBolusMessageBody.swift b/MinimedKit/Messages/ChangeMaxBolusMessageBody.swift new file mode 100644 index 000000000..ebb0ae4ce --- /dev/null +++ b/MinimedKit/Messages/ChangeMaxBolusMessageBody.swift @@ -0,0 +1,27 @@ +// +// ChangeMaxBolusMessageBody.swift +// MinimedKit +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + + +public class ChangeMaxBolusMessageBody: CarelinkLongMessageBody { + + static let multiplier: Double = 10 + + public convenience init?(maxBolusUnits: Double) { + guard maxBolusUnits >= 0 && maxBolusUnits <= 25 else { + return nil + } + + let ticks = UInt8(maxBolusUnits * type(of: self).multiplier) + var data = Data(bytes: [UInt8(clamping: ticks.bitWidth / 8)]) + data.appendBigEndian(ticks) + + self.init(rxData: data) + } + +} diff --git a/MinimedKit/Messages/ChangeRemoteControlIDMessageBody.swift b/MinimedKit/Messages/ChangeRemoteControlIDMessageBody.swift new file mode 100644 index 000000000..3de363c6a --- /dev/null +++ b/MinimedKit/Messages/ChangeRemoteControlIDMessageBody.swift @@ -0,0 +1,30 @@ +// +// ChangeRemoteControlIDMessageBody.swift +// MinimedKit +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + + +public class ChangeRemoteControlIDMessageBody: CarelinkLongMessageBody { + public convenience init?(id: Data? = nil, index: Int) { + guard index < 3 else { + return nil + } + + var rxData = Data(repeating: 0x2d, count: 8) // 2d signifies a deletion + rxData[0] = 0x07 // length + rxData[1] = UInt8(clamping: index) + + if let id = id { + for (index, byte) in id.enumerated() { + rxData[2 + index] = 0b00110000 + byte + } + } + + self.init(rxData: rxData) + } + +} diff --git a/MinimedKit/Messages/ReadOtherDevicesIDsMessageBody.swift b/MinimedKit/Messages/ReadOtherDevicesIDsMessageBody.swift index 9e266628b..57ccb1501 100644 --- a/MinimedKit/Messages/ReadOtherDevicesIDsMessageBody.swift +++ b/MinimedKit/Messages/ReadOtherDevicesIDsMessageBody.swift @@ -10,7 +10,7 @@ import Foundation public class ReadOtherDevicesIDsMessageBody: CarelinkLongMessageBody { - let ids: [Data] + public let ids: [Data] public required init?(rxData: Data) { guard rxData.count == type(of: self).length else { diff --git a/MinimedKit/Messages/ReadRemoteControlIDsMessageBody.swift b/MinimedKit/Messages/ReadRemoteControlIDsMessageBody.swift new file mode 100644 index 000000000..370009cdc --- /dev/null +++ b/MinimedKit/Messages/ReadRemoteControlIDsMessageBody.swift @@ -0,0 +1,44 @@ +// +// ReadRemoteControlIDsMessageBody.swift +// MinimedKit +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation + +private let idSize = 6 + +public class ReadRemoteControlIDsMessageBody: CarelinkLongMessageBody { + public let ids: [Data] + + public required init?(rxData: Data) { + guard rxData.count == type(of: self).length else { + return nil + } + + var ids: [Data] = [] + + remotes: for index in stride(from: 0, to: 3, by: 1) { + let start = (index * idSize + 1) + let end = start + idSize + + var remoteID = Data(capacity: idSize) + + for byte in rxData[start..CFBundlePackageType BNDL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/MinimedKitTests/Messages/ChangeMaxBasalRateMessageBodyTests.swift b/MinimedKitTests/Messages/ChangeMaxBasalRateMessageBodyTests.swift new file mode 100644 index 000000000..7aa2d5c3f --- /dev/null +++ b/MinimedKitTests/Messages/ChangeMaxBasalRateMessageBodyTests.swift @@ -0,0 +1,36 @@ +// +// ChangeMaxBasalRateMessageBodyTests.swift +// MinimedKitTests +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import XCTest +@testable import MinimedKit + +class ChangeMaxBasalRateMessageBodyTests: XCTestCase { + + func testMaxBasalRate() { + var body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 6.4)! + + XCTAssertEqual(Data(hexadecimalString: "0201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString) + + body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 4.0)! + + XCTAssertEqual(Data(hexadecimalString: "0200A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString) + } + + func testMaxBasalRateRounded() { + let body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 9.115)! + + XCTAssertEqual(Data(hexadecimalString: "02016c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString) + + + } + + func testMaxBasalRateOutOfRange() { + XCTAssertNil(ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: -1)) + XCTAssertNil(ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: 36)) + } + +} diff --git a/MinimedKitTests/Messages/ChangeMaxBolusMessageBodyTests.swift b/MinimedKitTests/Messages/ChangeMaxBolusMessageBodyTests.swift new file mode 100644 index 000000000..eb99f0bb6 --- /dev/null +++ b/MinimedKitTests/Messages/ChangeMaxBolusMessageBodyTests.swift @@ -0,0 +1,30 @@ +// +// ChangeMaxBolusMessageBodyTests.swift +// MinimedKitTests +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import XCTest +@testable import MinimedKit + +class ChangeMaxBolusMessageBodyTests: XCTestCase { + + func testMaxBolus() { + let body = ChangeMaxBolusMessageBody(maxBolusUnits: 6.4)! + + XCTAssertEqual(Data(hexadecimalString: "0140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString) + } + + func testMaxBolusRounded() { + let body = ChangeMaxBolusMessageBody(maxBolusUnits: 2.25)! + + XCTAssertEqual(Data(hexadecimalString: "0116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!, body.txData, body.txData.hexadecimalString) + } + + func testMaxBolusOutOfRange() { + XCTAssertNil(ChangeMaxBolusMessageBody(maxBolusUnits: -1)) + XCTAssertNil(ChangeMaxBolusMessageBody(maxBolusUnits: 26)) + } + +} diff --git a/MinimedKitTests/Messages/ChangeRemoteControlIDMessageBodyTests.swift b/MinimedKitTests/Messages/ChangeRemoteControlIDMessageBodyTests.swift new file mode 100644 index 000000000..e40c955e2 --- /dev/null +++ b/MinimedKitTests/Messages/ChangeRemoteControlIDMessageBodyTests.swift @@ -0,0 +1,28 @@ +// +// ChangeRemoteControlIDMessageBodyTests.swift +// MinimedKitTests +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import XCTest +@testable import MinimedKit + +class ChangeRemoteControlIDMessageBodyTests: XCTestCase { + + func testEncodeOneRemote() { + let expected = Data(hexadecimalString: "0700313233343536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")! + let body = ChangeRemoteControlIDMessageBody(id: Data(bytes: [1, 2, 3, 4, 5, 6]), index: 0)! + + XCTAssertEqual(expected, body.txData, body.txData.hexadecimalString) + } + + + func testEncodeZeroRemotes() { + let expected = Data(hexadecimalString: "07022d2d2d2d2d2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")! + let body = ChangeRemoteControlIDMessageBody(id: nil, index: 2)! + + XCTAssertEqual(expected, body.txData) + } + +} diff --git a/MinimedKitTests/Messages/ReadRemoteControlIDsMessageBodyTests.swift b/MinimedKitTests/Messages/ReadRemoteControlIDsMessageBodyTests.swift new file mode 100644 index 000000000..e31e58606 --- /dev/null +++ b/MinimedKitTests/Messages/ReadRemoteControlIDsMessageBodyTests.swift @@ -0,0 +1,42 @@ +// +// ReadRemoteControlIDsMessageBodyTests.swift +// MinimedKitTests +// +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import XCTest +@testable import MinimedKit + +class ReadRemoteControlIDsMessageBodyTests: XCTestCase { + + func testDecodeOneRemote() { + let message = PumpMessage(rxData: Data(hexadecimalString: "a759404076123132333435362d2d2d2d2d2d2d2d2d2d2d2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!)! + + let body = message.messageBody as! ReadRemoteControlIDsMessageBody + + XCTAssertEqual(1, body.ids.count) + XCTAssertEqual(Data(bytes: [1, 2, 3, 4, 5, 6]), body.ids[0]) + } + + + func testDecodeZeroRemotes() { + let message = PumpMessage(rxData: Data(hexadecimalString: "a759404076122d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!)! + + let body = message.messageBody as! ReadRemoteControlIDsMessageBody + + XCTAssertEqual(0, body.ids.count) + } + + func testDecodeThreeRemotes() { + let message = PumpMessage(rxData: Data(hexadecimalString: "a7594040761230303030303031303031303039393939393900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")!)! + + let body = message.messageBody as! ReadRemoteControlIDsMessageBody + + XCTAssertEqual(3, body.ids.count) + XCTAssertEqual(Data(bytes: [0, 0, 0, 0, 0, 0]), body.ids[0]) + XCTAssertEqual(Data(bytes: [1, 0, 0, 1, 0, 0]), body.ids[1]) + XCTAssertEqual(Data(bytes: [9, 9, 9, 9, 9, 9]), body.ids[2]) + } + +} diff --git a/NightscoutUploadKit/DeviceStatus/ForecastError.swift b/NightscoutUploadKit/DeviceStatus/ForecastError.swift new file mode 100644 index 000000000..105517165 --- /dev/null +++ b/NightscoutUploadKit/DeviceStatus/ForecastError.swift @@ -0,0 +1,32 @@ +// +// ForecastError.swift +// NightscoutUploadKit +// +// Created by Pete Schwamb on 5/28/18. +// Copyright © 2018 Pete Schwamb. All rights reserved. +// + +import Foundation +import HealthKit + +public struct ForecastError { + let velocity: Double + let measurementDuration: Double + + public init(velocity: HKQuantity, measurementDuration: TimeInterval) { + + let glucoseUnit = HKUnit.milligramsPerDeciliterUnit() + let velocityUnit = glucoseUnit.unitDivided(by: HKUnit.second()) + + self.velocity = velocity.doubleValue(for: velocityUnit) + self.measurementDuration = measurementDuration + } + + public var dictionaryRepresentation: [String: Any] { + var rval = [String: Any]() + rval["velocity"] = velocity + rval["measurementDuration"] = measurementDuration + //rval["velocityUnits"] = "mg/dL/s" + return rval + } +} diff --git a/NightscoutUploadKit/DeviceStatus/LoopStatus.swift b/NightscoutUploadKit/DeviceStatus/LoopStatus.swift index 15cb6332c..73a414edb 100644 --- a/NightscoutUploadKit/DeviceStatus/LoopStatus.swift +++ b/NightscoutUploadKit/DeviceStatus/LoopStatus.swift @@ -7,6 +7,7 @@ // import Foundation +import HealthKit public struct LoopStatus { let name: String @@ -22,9 +23,10 @@ public struct LoopStatus { let rileylinks: [RileyLinkStatus]? let failureReason: Error? let currentCorrectionRange: CorrectionRange? + let forecastError: ForecastError? + let testingDetails: [String: Any]? - - public init(name: String, version: String, timestamp: Date, iob: IOBStatus? = nil, cob: COBStatus? = nil, predicted: PredictedBG? = nil, recommendedTempBasal:RecommendedTempBasal? = nil, recommendedBolus: Double? = nil, enacted: LoopEnacted? = nil, rileylinks: [RileyLinkStatus]? = nil, failureReason: Error? = nil, currentCorrectionRange: CorrectionRange? = nil) { + public init(name: String, version: String, timestamp: Date, iob: IOBStatus? = nil, cob: COBStatus? = nil, predicted: PredictedBG? = nil, recommendedTempBasal:RecommendedTempBasal? = nil, recommendedBolus: Double? = nil, enacted: LoopEnacted? = nil, rileylinks: [RileyLinkStatus]? = nil, failureReason: Error? = nil, currentCorrectionRange: CorrectionRange? = nil, forecastError: ForecastError? = nil, testingDetails: [String: Any]? = nil) { self.name = name self.version = version self.timestamp = timestamp @@ -37,6 +39,8 @@ public struct LoopStatus { self.rileylinks = rileylinks self.failureReason = failureReason self.currentCorrectionRange = currentCorrectionRange + self.forecastError = forecastError + self.testingDetails = testingDetails } public var dictionaryRepresentation: [String: Any] { @@ -81,6 +85,14 @@ public struct LoopStatus { if let currentCorrectionRange = currentCorrectionRange { rval["currentCorrectionRange"] = currentCorrectionRange.dictionaryRepresentation } + + if let forecastError = forecastError { + rval["forecastError"] = forecastError + } + + if let testingDetails = testingDetails { + rval["testingDetails"] = testingDetails + } return rval } diff --git a/NightscoutUploadKit/Info.plist b/NightscoutUploadKit/Info.plist index 783e22ec8..a16c895d4 100644 --- a/NightscoutUploadKit/Info.plist +++ b/NightscoutUploadKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/NightscoutUploadKitTests/Info.plist b/NightscoutUploadKitTests/Info.plist index 840b2c791..6f3a2eb14 100644 --- a/NightscoutUploadKitTests/Info.plist +++ b/NightscoutUploadKitTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/RileyLink.xcodeproj/project.pbxproj b/RileyLink.xcodeproj/project.pbxproj index 99ee088d3..47c880b9a 100644 --- a/RileyLink.xcodeproj/project.pbxproj +++ b/RileyLink.xcodeproj/project.pbxproj @@ -104,6 +104,9 @@ 43CA93311CB97191000026B5 /* ReadTempBasalCarelinkMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CA93301CB97191000026B5 /* ReadTempBasalCarelinkMessageBodyTests.swift */; }; 43CA93331CB9726A000026B5 /* ChangeTimeCarelinMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CA93321CB9726A000026B5 /* ChangeTimeCarelinMessageBodyTests.swift */; }; 43CA93351CB9727F000026B5 /* ChangeTempBasalCarelinkMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CA93341CB9727F000026B5 /* ChangeTempBasalCarelinkMessageBodyTests.swift */; }; + 43CEC07420D0949B00F1BC19 /* ReadRemoteControlIDsMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CEC07320D0949B00F1BC19 /* ReadRemoteControlIDsMessageBody.swift */; }; + 43CEC07620D099B400F1BC19 /* SetRemoteControlEnabledMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CEC07520D099B400F1BC19 /* SetRemoteControlEnabledMessageBody.swift */; }; + 43CEC07820D0CF7200F1BC19 /* ReadRemoteControlIDsMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CEC07720D0CF7200F1BC19 /* ReadRemoteControlIDsMessageBodyTests.swift */; }; 43D5E7881FAEDAC4004ACDB7 /* PeripheralManagerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D5E7871FAEDAC4004ACDB7 /* PeripheralManagerError.swift */; }; 43D5E7921FAF7BFB004ACDB7 /* RileyLinkKitUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D5E7901FAF7BFB004ACDB7 /* RileyLinkKitUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43D5E7951FAF7BFB004ACDB7 /* RileyLinkKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43D5E78E1FAF7BFB004ACDB7 /* RileyLinkKitUI.framework */; }; @@ -122,6 +125,12 @@ 43DAD00220A6A470000F8529 /* ReadOtherDevicesStatusMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DAD00120A6A470000F8529 /* ReadOtherDevicesStatusMessageBody.swift */; }; 43DAD00420A6A677000F8529 /* ReadOtherDevicesIDsMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DAD00320A6A677000F8529 /* ReadOtherDevicesIDsMessageBody.swift */; }; 43DAD00620A6B10A000F8529 /* ReadOtherDevicesIDsMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DAD00520A6B10A000F8529 /* ReadOtherDevicesIDsMessageBodyTests.swift */; }; + 43DFB60B20D229CC008A7BAE /* ChangeRemoteControlIDMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB60A20D229CC008A7BAE /* ChangeRemoteControlIDMessageBody.swift */; }; + 43DFB60D20D22CCB008A7BAE /* ChangeRemoteControlIDMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB60C20D22CCB008A7BAE /* ChangeRemoteControlIDMessageBodyTests.swift */; }; + 43DFB60F20D3744A008A7BAE /* ChangeMaxBolusMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB60E20D3744A008A7BAE /* ChangeMaxBolusMessageBody.swift */; }; + 43DFB61120D37748008A7BAE /* ChangeMaxBolusMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB61020D37748008A7BAE /* ChangeMaxBolusMessageBodyTests.swift */; }; + 43DFB61320D37800008A7BAE /* ChangeMaxBasalRateMessageBodyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB61220D37800008A7BAE /* ChangeMaxBasalRateMessageBodyTests.swift */; }; + 43DFB61520D3791A008A7BAE /* ChangeMaxBasalRateMessageBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DFB61420D3791A008A7BAE /* ChangeMaxBasalRateMessageBody.swift */; }; 43EBE4521EAD23C40073A0B5 /* TimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EBE4501EAD238C0073A0B5 /* TimeInterval.swift */; }; 43EBE4531EAD23CE0073A0B5 /* TimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EBE4501EAD238C0073A0B5 /* TimeInterval.swift */; }; 43EBE4541EAD23EC0073A0B5 /* TimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EBE4501EAD238C0073A0B5 /* TimeInterval.swift */; }; @@ -305,6 +314,7 @@ C1842C241C8FA45100DB42AC /* BatteryPumpEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1842BFA1C8FA45100DB42AC /* BatteryPumpEvent.swift */; }; C1842C251C8FA45100DB42AC /* AlarmSensorPumpEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1842BFB1C8FA45100DB42AC /* AlarmSensorPumpEvent.swift */; }; C184875C20BC232F00ABE9E7 /* CorrectionRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = C184875B20BC232F00ABE9E7 /* CorrectionRange.swift */; }; + C184875E20BCDB0000ABE9E7 /* ForecastError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C184875D20BCDB0000ABE9E7 /* ForecastError.swift */; }; C18C8C531D64123400E043FB /* EnableBolusWizardPumpEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18C8C521D64123400E043FB /* EnableBolusWizardPumpEvent.swift */; }; C18EB742207EE20100EA002B /* NightscoutProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18EB741207EE20100EA002B /* NightscoutProfile.swift */; }; C1A492631D4A5A19008964FF /* IOBStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A492621D4A5A19008964FF /* IOBStatus.swift */; }; @@ -583,6 +593,9 @@ 43CA93301CB97191000026B5 /* ReadTempBasalCarelinkMessageBodyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadTempBasalCarelinkMessageBodyTests.swift; sourceTree = ""; }; 43CA93321CB9726A000026B5 /* ChangeTimeCarelinMessageBodyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeTimeCarelinMessageBodyTests.swift; sourceTree = ""; }; 43CA93341CB9727F000026B5 /* ChangeTempBasalCarelinkMessageBodyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeTempBasalCarelinkMessageBodyTests.swift; sourceTree = ""; }; + 43CEC07320D0949B00F1BC19 /* ReadRemoteControlIDsMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadRemoteControlIDsMessageBody.swift; sourceTree = ""; }; + 43CEC07520D099B400F1BC19 /* SetRemoteControlEnabledMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetRemoteControlEnabledMessageBody.swift; sourceTree = ""; }; + 43CEC07720D0CF7200F1BC19 /* ReadRemoteControlIDsMessageBodyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadRemoteControlIDsMessageBodyTests.swift; sourceTree = ""; }; 43D5E7871FAEDAC4004ACDB7 /* PeripheralManagerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeripheralManagerError.swift; sourceTree = ""; }; 43D5E78E1FAF7BFB004ACDB7 /* RileyLinkKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RileyLinkKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43D5E7901FAF7BFB004ACDB7 /* RileyLinkKitUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RileyLinkKitUI.h; sourceTree = ""; }; @@ -590,6 +603,12 @@ 43DAD00120A6A470000F8529 /* ReadOtherDevicesStatusMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadOtherDevicesStatusMessageBody.swift; sourceTree = ""; }; 43DAD00320A6A677000F8529 /* ReadOtherDevicesIDsMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadOtherDevicesIDsMessageBody.swift; sourceTree = ""; }; 43DAD00520A6B10A000F8529 /* ReadOtherDevicesIDsMessageBodyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadOtherDevicesIDsMessageBodyTests.swift; sourceTree = ""; }; + 43DFB60A20D229CC008A7BAE /* ChangeRemoteControlIDMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeRemoteControlIDMessageBody.swift; sourceTree = ""; }; + 43DFB60C20D22CCB008A7BAE /* ChangeRemoteControlIDMessageBodyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeRemoteControlIDMessageBodyTests.swift; sourceTree = ""; }; + 43DFB60E20D3744A008A7BAE /* ChangeMaxBolusMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeMaxBolusMessageBody.swift; sourceTree = ""; }; + 43DFB61020D37748008A7BAE /* ChangeMaxBolusMessageBodyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeMaxBolusMessageBodyTests.swift; sourceTree = ""; }; + 43DFB61220D37800008A7BAE /* ChangeMaxBasalRateMessageBodyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeMaxBasalRateMessageBodyTests.swift; sourceTree = ""; }; + 43DFB61420D3791A008A7BAE /* ChangeMaxBasalRateMessageBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeMaxBasalRateMessageBody.swift; sourceTree = ""; }; 43EBE4501EAD238C0073A0B5 /* TimeInterval.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeInterval.swift; sourceTree = ""; }; 43EC9DCA1B786C6200DB0D18 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; 43F348051D596270009933DC /* HKUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HKUnit.swift; sourceTree = ""; }; @@ -797,6 +816,7 @@ C1842C281C908A3C00DB42AC /* NightscoutUploader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutUploader.swift; sourceTree = ""; }; C1842C2A1C90DFB600DB42AC /* NightscoutPumpEvents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutPumpEvents.swift; sourceTree = ""; }; C184875B20BC232F00ABE9E7 /* CorrectionRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CorrectionRange.swift; sourceTree = ""; }; + C184875D20BCDB0000ABE9E7 /* ForecastError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastError.swift; sourceTree = ""; }; C18C8C521D64123400E043FB /* EnableBolusWizardPumpEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnableBolusWizardPumpEvent.swift; sourceTree = ""; }; C18EB741207EE20100EA002B /* NightscoutProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutProfile.swift; sourceTree = ""; }; C1A492621D4A5A19008964FF /* IOBStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IOBStatus.swift; sourceTree = ""; }; @@ -1215,6 +1235,9 @@ isa = PBXGroup; children = ( C12198A21C8DFC3600BC374C /* BolusCarelinkMessageBodyTests.swift */, + 43DFB61220D37800008A7BAE /* ChangeMaxBasalRateMessageBodyTests.swift */, + 43DFB61020D37748008A7BAE /* ChangeMaxBolusMessageBodyTests.swift */, + 43DFB60C20D22CCB008A7BAE /* ChangeRemoteControlIDMessageBodyTests.swift */, 43CA93341CB9727F000026B5 /* ChangeTempBasalCarelinkMessageBodyTests.swift */, 43CA93321CB9726A000026B5 /* ChangeTimeCarelinMessageBodyTests.swift */, C12198601C8DEB7B00BC374C /* DeviceLinkMessageBodyTests.swift */, @@ -1226,6 +1249,7 @@ 541688DA1DB820BF005B1891 /* ReadCurrentGlucosePageMessageBodyTests.swift */, 43DAD00520A6B10A000F8529 /* ReadOtherDevicesIDsMessageBodyTests.swift */, 43A068EB1CF6BA6900F9EFE4 /* ReadRemainingInsulinMessageBodyTests.swift */, + 43CEC07720D0CF7200F1BC19 /* ReadRemoteControlIDsMessageBodyTests.swift */, C1EAD6D41C826C43006DBA60 /* ReadSettingsCarelinkMessageBodyTests.swift */, 43CA93301CB97191000026B5 /* ReadTempBasalCarelinkMessageBodyTests.swift */, ); @@ -1501,6 +1525,7 @@ C1E5BEAC1D5E26F200BD4390 /* RileyLinkStatus.swift */, C1BAD1171E63984C009BA1C6 /* RadioAdapter.swift */, C184875B20BC232F00ABE9E7 /* CorrectionRange.swift */, + C184875D20BCDB0000ABE9E7 /* ForecastError.swift */, ); path = DeviceStatus; sourceTree = ""; @@ -1575,6 +1600,9 @@ C121989E1C8DFC2200BC374C /* BolusCarelinkMessageBody.swift */, C1711A551C94F13400CB25BD /* ButtonPressCarelinkMessageBody.swift */, C1EAD6BD1C826B92006DBA60 /* CarelinkMessageBody.swift */, + 43DFB61420D3791A008A7BAE /* ChangeMaxBasalRateMessageBody.swift */, + 43DFB60E20D3744A008A7BAE /* ChangeMaxBolusMessageBody.swift */, + 43DFB60A20D229CC008A7BAE /* ChangeRemoteControlIDMessageBody.swift */, 43CA93281CB8CF22000026B5 /* ChangeTempBasalCarelinkMessageBody.swift */, 43CA932A1CB8CF76000026B5 /* ChangeTimeCarelinkMessageBody.swift */, C1F0004B1EBE68A600F65163 /* DataFrameMessageBody.swift */, @@ -1600,7 +1628,9 @@ C1EAD6C31C826B92006DBA60 /* ReadSettingsCarelinkMessageBody.swift */, 43CA932C1CB8CFA1000026B5 /* ReadTempBasalCarelinkMessageBody.swift */, 43CA932D1CB8CFA1000026B5 /* ReadTimeCarelinkMessageBody.swift */, + 43CEC07320D0949B00F1BC19 /* ReadRemoteControlIDsMessageBody.swift */, 43BF58AF1FF594CB00499C46 /* SelectBasalProfileMessageBody.swift */, + 43CEC07520D099B400F1BC19 /* SetRemoteControlEnabledMessageBody.swift */, C1EAD6C41C826B92006DBA60 /* UnknownMessageBody.swift */, ); path = Messages; @@ -1931,12 +1961,10 @@ LastSwiftMigration = 0900; }; C12EA236198B436800309FA4 = { - DevelopmentTeam = 57NRR26737; LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; C12EA251198B436800309FA4 = { - DevelopmentTeam = 57NRR26737; ProvisioningStyle = Automatic; TestTargetID = C12EA236198B436800309FA4; }; @@ -2193,10 +2221,12 @@ C1842BD11C8FA3D200DB42AC /* AlarmClockReminderPumpEvent.swift in Sources */, 43DAD00220A6A470000F8529 /* ReadOtherDevicesStatusMessageBody.swift in Sources */, C1842C1B1C8FA45100DB42AC /* ChangeBolusReminderEnablePumpEvent.swift in Sources */, + 43DFB60B20D229CC008A7BAE /* ChangeRemoteControlIDMessageBody.swift in Sources */, C1842BC51C8F897E00DB42AC /* BasalProfileStartPumpEvent.swift in Sources */, 54BC448C1DB47BEA00340EED /* SensorCalGlucoseEvent.swift in Sources */, C14FFC4A1D3AF1AC0049CF85 /* JournalEntryInsulinMarkerPumpEvent.swift in Sources */, C1842C081C8FA45100DB42AC /* ChangeWatchdogMarriageProfilePumpEvent.swift in Sources */, + 43DFB61520D3791A008A7BAE /* ChangeMaxBasalRateMessageBody.swift in Sources */, C1842BFF1C8FA45100DB42AC /* DailyTotal522PumpEvent.swift in Sources */, C1842C1A1C8FA45100DB42AC /* ChangeBolusReminderTimePumpEvent.swift in Sources */, C12198B31C8F730700BC374C /* BolusWizardEstimatePumpEvent.swift in Sources */, @@ -2204,6 +2234,7 @@ C1842BC11C8E8B2500DB42AC /* UnabsorbedInsulinPumpEvent.swift in Sources */, C1EAD6B51C826B6D006DBA60 /* MessageType.swift in Sources */, C1842C111C8FA45100DB42AC /* ChangeParadigmLinkIDPumpEvent.swift in Sources */, + 43DFB60F20D3744A008A7BAE /* ChangeMaxBolusMessageBody.swift in Sources */, 54BC44981DB47D5300340EED /* SensorSyncGlucoseEvent.swift in Sources */, 54BC448A1DB47BA500340EED /* SensorWeakSignalGlucoseEvent.swift in Sources */, C1C3578F1C927303009BDD4F /* MeterMessage.swift in Sources */, @@ -2251,6 +2282,7 @@ C1FDFCA91D964A3E00ADBC31 /* BolusReminderPumpEvent.swift in Sources */, 43CA93291CB8CF22000026B5 /* ChangeTempBasalCarelinkMessageBody.swift in Sources */, C1EAD6CD1C826B92006DBA60 /* PowerOnCarelinkMessageBody.swift in Sources */, + 43CEC07620D099B400F1BC19 /* SetRemoteControlEnabledMessageBody.swift in Sources */, C1EAD6C81C826B92006DBA60 /* CarelinkMessageBody.swift in Sources */, C1A721621EC3E0500080FAD7 /* PumpErrorMessageBody.swift in Sources */, 546A85D41DF7BE1400733213 /* SensorErrorGlucoseEvent.swift in Sources */, @@ -2306,6 +2338,7 @@ C1842BC31C8E931E00DB42AC /* BolusNormalPumpEvent.swift in Sources */, 541688DD1DB82213005B1891 /* ReadCurrentGlucosePageMessageBody.swift in Sources */, 43CA932F1CB8CFA1000026B5 /* ReadTimeCarelinkMessageBody.swift in Sources */, + 43CEC07420D0949B00F1BC19 /* ReadRemoteControlIDsMessageBody.swift in Sources */, 431CE7971F9B0F0200255374 /* OSLog.swift in Sources */, 2FDE1A071E57B12D00B56A27 /* ReadCurrentPageNumberMessageBody.swift in Sources */, 43EBE4521EAD23C40073A0B5 /* TimeInterval.swift in Sources */, @@ -2350,6 +2383,7 @@ 54BC44B11DB70F4A00340EED /* GlucoseSensorDataGlucoseEventTests.swift in Sources */, 43A068EC1CF6BA6900F9EFE4 /* ReadRemainingInsulinMessageBodyTests.swift in Sources */, 2F962EC81E7074E60070EFBD /* BolusNormalPumpEventTests.swift in Sources */, + 43DFB61320D37800008A7BAE /* ChangeMaxBasalRateMessageBodyTests.swift in Sources */, C1EAD6D61C826C43006DBA60 /* MySentryPumpStatusMessageBodyTests.swift in Sources */, 43DAD00620A6B10A000F8529 /* ReadOtherDevicesIDsMessageBodyTests.swift in Sources */, C1EAD6D81C826C43006DBA60 /* ReadSettingsCarelinkMessageBodyTests.swift in Sources */, @@ -2366,6 +2400,7 @@ 43CA93311CB97191000026B5 /* ReadTempBasalCarelinkMessageBodyTests.swift in Sources */, 54BC44A91DB704A600340EED /* CalBGForGHGlucoseEventTests.swift in Sources */, C1F000501EBE727C00F65163 /* BasalScheduleTests.swift in Sources */, + 43CEC07820D0CF7200F1BC19 /* ReadRemoteControlIDsMessageBodyTests.swift in Sources */, 43FF221C1CB9B9DE00024F30 /* NSDateComponents.swift in Sources */, C12198A31C8DFC3600BC374C /* BolusCarelinkMessageBodyTests.swift in Sources */, C121985F1C8DE77D00BC374C /* FindDeviceMessageBodyTests.swift in Sources */, @@ -2374,9 +2409,11 @@ C1EAD6D71C826C43006DBA60 /* NSDataTests.swift in Sources */, 54BC44731DB46A5200340EED /* GlucosePageTests.swift in Sources */, 54BC44AF1DB70C3E00340EED /* TenSomethingGlucoseEventTests.swift in Sources */, + 43DFB61120D37748008A7BAE /* ChangeMaxBolusMessageBodyTests.swift in Sources */, C143031A1C9A610B00A40450 /* GetBatteryCarelinkMessageBodyTests.swift in Sources */, 43CA93351CB9727F000026B5 /* ChangeTempBasalCarelinkMessageBodyTests.swift in Sources */, 54BC44B71DB81B5100340EED /* GetGlucosePageMessageBodyTests.swift in Sources */, + 43DFB60D20D22CCB008A7BAE /* ChangeRemoteControlIDMessageBodyTests.swift in Sources */, C1EAD6E01C82B910006DBA60 /* CRC8Tests.swift in Sources */, 2F962EC11E6872170070EFBD /* TimestampedHistoryEventTests.swift in Sources */, 54BC44B51DB7184D00340EED /* NSStringExtensions.swift in Sources */, @@ -2451,6 +2488,7 @@ C1A492691D4A66C0008964FF /* LoopEnacted.swift in Sources */, C1A492651D4A5DEB008964FF /* BatteryStatus.swift in Sources */, C1A492631D4A5A19008964FF /* IOBStatus.swift in Sources */, + C184875E20BCDB0000ABE9E7 /* ForecastError.swift in Sources */, 431CE7991F9B0F0200255374 /* OSLog.swift in Sources */, 43F348061D596270009933DC /* HKUnit.swift in Sources */, C133CF931D5943780034B82D /* PredictedBG.swift in Sources */, @@ -2675,7 +2713,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RileyLinkBLEKit/Info.plist; @@ -2711,7 +2749,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RileyLinkBLEKit/Info.plist; @@ -2787,11 +2825,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -2818,11 +2856,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -2885,12 +2923,12 @@ CLANG_WARN_SUSPICIOUS_MOVES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Crypto/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -2913,12 +2951,12 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Crypto/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -2943,12 +2981,12 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RileyLinkKitUI/Info.plist; @@ -2979,12 +3017,12 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = RileyLinkKitUI/Info.plist; @@ -3008,12 +3046,12 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -3039,11 +3077,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -3126,7 +3164,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -3185,7 +3223,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -3217,7 +3255,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 57NRR26737; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "RileyLink/RileyLink-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.rileylink.rlapp; @@ -3238,7 +3276,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 57NRR26737; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "RileyLink/RileyLink-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.rileylink.rlapp; @@ -3257,7 +3295,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 57NRR26737; + DEVELOPMENT_TEAM = ""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = "RileyLinkTests/RileyLinkTests-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -3277,7 +3315,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 57NRR26737; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "RileyLinkTests/RileyLinkTests-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.rileylink.${PRODUCT_NAME:rfc1034identifier}"; @@ -3297,11 +3335,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -3327,11 +3365,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 37; + CURRENT_PROJECT_VERSION = 38; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 37; + DYLIB_CURRENT_VERSION = 38; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; diff --git a/RileyLink.xcodeproj/xcshareddata/xcschemes/Crypto.xcscheme b/RileyLink.xcodeproj/xcshareddata/xcschemes/Crypto.xcscheme index c2a4ee56c..f05946d32 100644 --- a/RileyLink.xcodeproj/xcshareddata/xcschemes/Crypto.xcscheme +++ b/RileyLink.xcodeproj/xcshareddata/xcschemes/Crypto.xcscheme @@ -1,6 +1,6 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/RileyLinkBLEKit/Info.plist b/RileyLinkBLEKit/Info.plist index 12c94a4e8..0e8b81880 100644 --- a/RileyLinkBLEKit/Info.plist +++ b/RileyLinkBLEKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/RileyLinkBLEKit/RileyLinkDeviceError.swift b/RileyLinkBLEKit/RileyLinkDeviceError.swift index e0e669bc7..b88aad5cc 100644 --- a/RileyLinkBLEKit/RileyLinkDeviceError.swift +++ b/RileyLinkBLEKit/RileyLinkDeviceError.swift @@ -39,7 +39,7 @@ extension RileyLinkDeviceError: LocalizedError { case .peripheralManagerError(let error): return error.failureReason default: - return errorDescription + return nil } } } diff --git a/RileyLinkBLEKitTests/Info.plist b/RileyLinkBLEKitTests/Info.plist index 40302d5d0..83957c236 100644 --- a/RileyLinkBLEKitTests/Info.plist +++ b/RileyLinkBLEKitTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleVersion 1 diff --git a/RileyLinkKit/Info.plist b/RileyLinkKit/Info.plist index 783e22ec8..a16c895d4 100644 --- a/RileyLinkKit/Info.plist +++ b/RileyLinkKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/RileyLinkKit/PumpOps.swift b/RileyLinkKit/PumpOps.swift index 1c0c4e11f..bea775877 100644 --- a/RileyLinkKit/PumpOps.swift +++ b/RileyLinkKit/PumpOps.swift @@ -22,7 +22,7 @@ public class PumpOps { private var pumpState: PumpState { didSet { - delegate.pumpOps(self, didChange: pumpState) + delegate?.pumpOps(self, didChange: pumpState) } } @@ -30,9 +30,9 @@ public class PumpOps { private let sessionQueue = DispatchQueue(label: "com.rileylink.RileyLinkKit.PumpOps", qos: .utility) - private unowned let delegate: PumpOpsDelegate + private weak var delegate: PumpOpsDelegate? - public init(pumpSettings: PumpSettings, pumpState: PumpState?, delegate: PumpOpsDelegate) { + public init(pumpSettings: PumpSettings, pumpState: PumpState?, delegate: PumpOpsDelegate?) { self.pumpSettings = pumpSettings self.delegate = delegate @@ -40,7 +40,7 @@ public class PumpOps { self.pumpState = pumpState } else { self.pumpState = PumpState() - self.delegate.pumpOps(self, didChange: self.pumpState) + self.delegate?.pumpOps(self, didChange: self.pumpState) } } @@ -98,6 +98,7 @@ public class PumpOps { NotificationCenter.default.post(name: .DeviceRadioConfigDidChange, object: device) NotificationCenter.default.addObserver(self, selector: #selector(deviceRadioConfigDidChange(_:)), name: .DeviceRadioConfigDidChange, object: device) + NotificationCenter.default.addObserver(self, selector: #selector(deviceRadioConfigDidChange(_:)), name: .DeviceConnectionStateDidChange, object: device) configuredDevices.insert(device) } @@ -107,6 +108,7 @@ public class PumpOps { } NotificationCenter.default.removeObserver(self, name: .DeviceRadioConfigDidChange, object: device) + NotificationCenter.default.removeObserver(self, name: .DeviceConnectionStateDidChange, object: device) configuredDevices.remove(device) } } diff --git a/RileyLinkKit/PumpOpsSession.swift b/RileyLinkKit/PumpOpsSession.swift index ccf18857f..5cdec2bf0 100644 --- a/RileyLinkKit/PumpOpsSession.swift +++ b/RileyLinkKit/PumpOpsSession.swift @@ -229,7 +229,7 @@ extension PumpOpsSession { /// - PumpOpsError.noResponse /// - PumpOpsError.unexpectedResponse /// - PumpOpsError.unknownResponse - public func getBasalSchedule(for profile: BasalProfile = .standard) throws -> BasalSchedule { + public func getBasalSchedule(for profile: BasalProfile = .standard) throws -> BasalSchedule? { try wakeup() var isFinished = false @@ -243,21 +243,45 @@ extension PumpOpsSession { message = PumpMessage(settings: settings, type: .pumpAck) } - return BasalSchedule(rawValue: scheduleData)! + return BasalSchedule(rawValue: scheduleData) } + /// - Throws: + /// - PumpOpsError.crosstalk + /// - PumpOpsError.deviceError + /// - PumpOpsError.noResponse + /// - PumpOpsError.unexpectedResponse + /// - PumpOpsError.unknownResponse public func getOtherDevicesIDs() throws -> ReadOtherDevicesIDsMessageBody { try wakeup() return try session.getResponse(to: PumpMessage(settings: settings, type: .readOtherDevicesIDs), responseType: .readOtherDevicesIDs) } + /// - Throws: + /// - PumpOpsError.crosstalk + /// - PumpOpsError.deviceError + /// - PumpOpsError.noResponse + /// - PumpOpsError.unexpectedResponse + /// - PumpOpsError.unknownResponse public func getOtherDevicesEnabled() throws -> Bool { try wakeup() let response: ReadOtherDevicesStatusMessageBody = try session.getResponse(to: PumpMessage(settings: settings, type: .readOtherDevicesStatus), responseType: .readOtherDevicesStatus) return response.isEnabled } + + /// - Throws: + /// - PumpOpsError.crosstalk + /// - PumpOpsError.deviceError + /// - PumpOpsError.noResponse + /// - PumpOpsError.unexpectedResponse + /// - PumpOpsError.unknownResponse + public func getRemoteControlIDs() throws -> ReadRemoteControlIDsMessageBody { + try wakeup() + + return try session.getResponse(to: PumpMessage(settings: settings, type: .readRemoteControlIDs), responseType: .readRemoteControlIDs) + } } @@ -364,6 +388,28 @@ extension PumpOpsSession { let _: PumpAckMessageBody = try runCommandWithArguments(message) } + /// - Throws: PumpCommandError + public func setMaxBasalRate(unitsPerHour: Double) throws { + guard let body = ChangeMaxBasalRateMessageBody(maxBasalUnitsPerHour: unitsPerHour) else { + throw PumpCommandError.command(PumpOpsError.pumpError(PumpErrorCode.maxSettingExceeded)) + } + + let message = PumpMessage(settings: settings, type: .setMaxBasalRate, body: body) + + let _: PumpAckMessageBody = try runCommandWithArguments(message) + } + + /// - Throws: PumpCommandError + public func setMaxBolus(units: Double) throws { + guard let body = ChangeMaxBolusMessageBody(maxBolusUnits: units) else { + throw PumpCommandError.command(PumpOpsError.pumpError(PumpErrorCode.maxSettingExceeded)) + } + + let message = PumpMessage(settings: settings, type: .setMaxBolus, body: body) + + let _: PumpAckMessageBody = try runCommandWithArguments(message) + } + /// Changes the current temporary basal rate /// /// - Parameters: @@ -512,9 +558,37 @@ extension PumpOpsSession { return } - /// - Throws: `PumpCommandError` specifying the failure sequence - public func setBasalSchedule(_ basalSchedule: BasalSchedule, for profile: BasalProfile, type: MessageType) throws { + /// - Throws: PumpCommandError + public func setRemoteControlEnabled(_ enabled: Bool) throws { + let message = PumpMessage(settings: settings, type: .setRemoteControlEnabled, body: SetRemoteControlEnabledMessageBody(enabled: enabled)) + + let _: PumpAckMessageBody = try runCommandWithArguments(message) + } + + /// - Throws: PumpCommandError + public func setRemoteControlID(_ id: Data, atIndex index: Int) throws { + guard let body = ChangeRemoteControlIDMessageBody(id: id, index: index) else { + throw PumpCommandError.command(PumpOpsError.pumpError(PumpErrorCode.maxSettingExceeded)) + } + + let message = PumpMessage(settings: settings, type: .setRemoteControlID, body: body) + + let _: PumpAckMessageBody = try runCommandWithArguments(message) + } + + /// - Throws: PumpCommandError + public func removeRemoteControlID(atIndex index: Int) throws { + guard let body = ChangeRemoteControlIDMessageBody(id: nil, index: index) else { + throw PumpCommandError.command(PumpOpsError.pumpError(PumpErrorCode.maxSettingExceeded)) + } + + let message = PumpMessage(settings: settings, type: .setRemoteControlID, body: body) + let _: PumpAckMessageBody = try runCommandWithArguments(message) + } + + /// - Throws: `PumpCommandError` specifying the failure sequence + public func setBasalSchedule(_ basalSchedule: BasalSchedule, for profile: BasalProfile) throws { let frames = DataFrameMessageBody.dataFramesFromContents(basalSchedule.rawValue) @@ -522,14 +596,21 @@ extension PumpOpsSession { return } - NSLog(firstFrame.txData.hexadecimalString) + let type: MessageType + switch profile { + case .standard: + type = .setBasalProfileStandard + case .profileA: + type = .setBasalProfileA + case .profileB: + type = .setBasalProfileB + } let message = PumpMessage(settings: settings, type: type, body: firstFrame) let _: PumpAckMessageBody = try runCommandWithArguments(message) for nextFrame in frames.dropFirst() { let message = PumpMessage(settings: settings, type: type, body: nextFrame) - NSLog(nextFrame.txData.hexadecimalString) do { let _: PumpAckMessageBody = try session.getResponse(to: message) } catch let error as PumpOpsError { diff --git a/RileyLinkKit/PumpSettings.swift b/RileyLinkKit/PumpSettings.swift index 024cef51e..e36e90fc2 100644 --- a/RileyLinkKit/PumpSettings.swift +++ b/RileyLinkKit/PumpSettings.swift @@ -51,7 +51,7 @@ extension PumpSettings: CustomDebugStringConvertible { "## PumpSettings", "pumpID: ✔︎", "pumpRegion: \(pumpRegion)", - ].joined(separator: "\n") + ].joined(separator: "\n") } } diff --git a/RileyLinkKit/PumpState.swift b/RileyLinkKit/PumpState.swift index b2ca14269..18f6aaf97 100644 --- a/RileyLinkKit/PumpState.swift +++ b/RileyLinkKit/PumpState.swift @@ -10,7 +10,7 @@ import Foundation import MinimedKit -public struct PumpState: RawRepresentable { +public struct PumpState: RawRepresentable, Equatable { public typealias RawValue = [String: Any] public var timeZone: TimeZone diff --git a/RileyLinkKitTests/Info.plist b/RileyLinkKitTests/Info.plist index b7683fde8..9798c2ab8 100644 --- a/RileyLinkKitTests/Info.plist +++ b/RileyLinkKitTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion diff --git a/RileyLinkKitUI/CommandResponseViewController+RileyLinkDevice.swift b/RileyLinkKitUI/CommandResponseViewController+RileyLinkDevice.swift index 8b06de238..8eade33ae 100644 --- a/RileyLinkKitUI/CommandResponseViewController+RileyLinkDevice.swift +++ b/RileyLinkKitUI/CommandResponseViewController+RileyLinkDevice.swift @@ -188,9 +188,9 @@ extension CommandResponseViewController { ops?.runSession(withName: "Get Basal Settings", using: device) { (session) in let response: String do { - let schedule = try session.getBasalSchedule(for: .standard) - var str = String(format: NSLocalizedString("%1$@ basal schedule entries\n", comment: "The format string describing number of basal schedule entries: (1: number of entries)"), integerFormatter.string(from: NSNumber(value: schedule.entries.count))!) - for entry in schedule.entries { + let schedule = try session.getBasalSchedule(for: .profileB) + var str = String(format: NSLocalizedString("%1$@ basal schedule entries\n", comment: "The format string describing number of basal schedule entries: (1: number of entries)"), integerFormatter.string(from: NSNumber(value: schedule?.entries.count ?? 0))!) + for entry in schedule?.entries ?? [] { str += "\(String(describing: entry))\n" } response = str diff --git a/RileyLinkKitUI/Info.plist b/RileyLinkKitUI/Info.plist index 12c94a4e8..0e8b81880 100644 --- a/RileyLinkKitUI/Info.plist +++ b/RileyLinkKitUI/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/RileyLinkTests/RileyLinkTests-Info.plist b/RileyLinkTests/RileyLinkTests-Info.plist index 5422a5804..8e3ad2ab9 100644 --- a/RileyLinkTests/RileyLinkTests-Info.plist +++ b/RileyLinkTests/RileyLinkTests-Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.0.1 + 2.0.2 CFBundleSignature ???? CFBundleVersion