Skip to content

Commit

Permalink
Add ability to disconnect from observing peripheral updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Mikołaj Piechocki committed Dec 1, 2020
1 parent 9c15055 commit d910ad4
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 13 deletions.
6 changes: 5 additions & 1 deletion ExampleApp/ExampleApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
8D61CCA1254C4F8C00952B2B /* CharacteristicCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D61CCA0254C4F8C00952B2B /* CharacteristicCell.swift */; };
8D61CCA5254C554F00952B2B /* CharacteristicReadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D61CCA4254C554F00952B2B /* CharacteristicReadViewController.swift */; };
8D61CCA9254C558200952B2B /* CharacteristicReadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D61CCA8254C558200952B2B /* CharacteristicReadView.swift */; };
8D6202CB2576DAB500E66BF6 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D6202CA2576DAB500E66BF6 /* Constants.swift */; };
8D72C58A2539C65000456D1A /* RxBluetoothKit in Frameworks */ = {isa = PBXBuildFile; productRef = 8D72C5892539C65000456D1A /* RxBluetoothKit */; };
8D72C58F2539C87300456D1A /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D72C58E2539C87300456D1A /* WelcomeView.swift */; };
8D76F72B2546B5D200FF4DDB /* CentralServicesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D76F72A2546B5D200FF4DDB /* CentralServicesViewController.swift */; };
Expand Down Expand Up @@ -60,6 +61,7 @@
8D61CCA0254C4F8C00952B2B /* CharacteristicCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacteristicCell.swift; sourceTree = "<group>"; };
8D61CCA4254C554F00952B2B /* CharacteristicReadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacteristicReadViewController.swift; sourceTree = "<group>"; };
8D61CCA8254C558200952B2B /* CharacteristicReadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacteristicReadView.swift; sourceTree = "<group>"; };
8D6202CA2576DAB500E66BF6 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
8D72C58E2539C87300456D1A /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = "<group>"; };
8D76F72A2546B5D200FF4DDB /* CentralServicesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CentralServicesViewController.swift; sourceTree = "<group>"; };
8D76F7342546C4D900FF4DDB /* CentralServiceCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CentralServiceCell.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -183,14 +185,14 @@
8D72C5832539C34400456D1A /* Screens */ = {
isa = PBXGroup;
children = (
8D117DC2254FDAB5003807B3 /* CharacteristicWrite */,
8D896D502542FFA900FD5FE5 /* Central */,
8D896D492542FCB100FD5FE5 /* CentralList */,
8D4839A0254AABDC00266106 /* CentralServiceChacacteristics */,
8D76F7292546B5C500FF4DDB /* CentralServices */,
8D72C5862539C3BD00456D1A /* CentralSpecific */,
8D117DB1254FD1C5003807B3 /* CharacteristicNotify */,
8D61CCA3254C553500952B2B /* CharacteristicRead */,
8D117DC2254FDAB5003807B3 /* CharacteristicWrite */,
8D61CC90254C478200952B2B /* Peripheral */,
8D61CC98254C4A6800952B2B /* PeripheralRead */,
8D72C5872539C3C700456D1A /* PeripheralUpdate */,
Expand Down Expand Up @@ -295,6 +297,7 @@
isa = PBXGroup;
children = (
8DF924C2254AE4F40027627D /* Error+Printable.swift */,
8D6202CA2576DAB500E66BF6 /* Constants.swift */,
);
path = Utilities;
sourceTree = "<group>";
Expand Down Expand Up @@ -397,6 +400,7 @@
8D896D522542FFB300FD5FE5 /* CentralViewController.swift in Sources */,
8D896D472542D7C500FD5FE5 /* AlertPresenter.swift in Sources */,
8D61CCA9254C558200952B2B /* CharacteristicReadView.swift in Sources */,
8D6202CB2576DAB500E66BF6 /* Constants.swift in Sources */,
8D61CC9A254C4A7800952B2B /* PeripheralReadViewController.swift in Sources */,
8D117DBC254FD47B003807B3 /* PeripheralWriteViewController.swift in Sources */,
8D76F72B2546B5D200FF4DDB /* CentralServicesViewController.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class CentralSpecificView: UIView {

let serviceUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Service UUID"
textField.placeholder = Labels.serviceUuidPlaceholder
return textField
}()

let characteristicUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Characteristic UUID"
textField.placeholder = Labels.characteristicUuidPlaceholder
return textField
}()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,17 @@ class CentralSpecificViewController: UIViewController {

// MARK: - Private

private let disposeBag = DisposeBag()
private var isConnected: Bool {
connection != nil
}
private var connection: Disposable?
private lazy var manager = CentralManager()

@objc private func handleConnectButton() {
isConnected ? diconnect() : connect()
}

private func connect() {
guard let serviceUuidString = centralSpecificView.serviceUuidTextField.text,
let characteristicUuidString = centralSpecificView.characteristicUuidTextField.text else { return }

Expand All @@ -41,17 +48,24 @@ class CentralSpecificViewController: UIViewController {
scanAndConnect(serviceUuid: serviceUuid, characteristicUuid: characteristicUuid)
}

private func diconnect() {
connection?.dispose()
connection = nil
centralSpecificView.readValueLabel.isEnabled = false
centralSpecificView.connectButton.setTitle("Connect", for: .normal)
}

private func scanAndConnect(serviceUuid: CBUUID, characteristicUuid: CBUUID) {
let managerIsOn = manager.observeStateWithInitialValue()
.filter { $0 == .poweredOn }
.map { _ in }

Observable.combineLatest(managerIsOn, Observable.just(manager)) { $1 }
connection = Observable.combineLatest(managerIsOn, Observable.just(manager)) { $1 }
.flatMap { $0.scanForPeripherals(withServices: [serviceUuid]) }
.timeout(.seconds(7), scheduler: MainScheduler.instance)
.take(1)
.flatMap { $0.peripheral.establishConnection() }
.do(onNext: { [weak self] _ in self?.centralSpecificView.readValueLabel.isEnabled = true })
.do(onNext: { [weak self] _ in self?.connected() })
.flatMap { $0.discoverServices([serviceUuid]) }
.flatMap { Observable.from($0) }
.flatMap { $0.discoverCharacteristics([characteristicUuid]) }
Expand All @@ -66,11 +80,15 @@ class CentralSpecificViewController: UIViewController {
AlertPresenter.presentError(with: $0.printable, on: self?.navigationController)
}
)
.disposed(by: disposeBag)
}

private func updateValue(_ value: String) {
centralSpecificView.readValueLabel.text = "Read value: " + value
}

private func connected() {
centralSpecificView.readValueLabel.isEnabled = true
centralSpecificView.connectButton.setTitle("Disconnect", for: .normal)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class PeripheralReadView: UIView {

let serviceUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Service UUID"
textField.placeholder = Labels.serviceUuidPlaceholder
return textField
}()

let characteristicUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Characteristic UUID"
textField.placeholder = Labels.characteristicUuidPlaceholder
return textField
}()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class PeripheralUpdateView: UIView {

let serviceUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Service UUID"
textField.placeholder = Labels.serviceUuidPlaceholder
return textField
}()

let characteristicUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Characteristic UUID"
textField.placeholder = Labels.characteristicUuidPlaceholder
return textField
}()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class PeripheralWriteView: UIView {

let serviceUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Service UUID"
textField.placeholder = Labels.serviceUuidPlaceholder
return textField
}()

let characteristicUuidTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Characteristic UUID"
textField.placeholder = Labels.characteristicUuidPlaceholder
return textField
}()

Expand Down
4 changes: 4 additions & 0 deletions ExampleApp/ExampleApp/Utilities/Constants.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
struct Labels {
static let serviceUuidPlaceholder = "Service UUID, f.e. AAA1"
static let characteristicUuidPlaceholder = "Charac. UUID, f.e. BBB2"
}

0 comments on commit d910ad4

Please sign in to comment.