Skip to content

Commit

Permalink
[wip] 切断周りを実装した
Browse files Browse the repository at this point in the history
  • Loading branch information
Gurrium committed Jun 13, 2022
1 parent bc0d793 commit bcc5ee9
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 26 deletions.
12 changes: 9 additions & 3 deletions Komusou/BluetoothManager.swift
Expand Up @@ -20,7 +20,7 @@ protocol CentralManager: AnyObject {
func stopScan()
func retrievePeripherals(withIdentifiers: [UUID]) -> [Peripheral]
func connect(_ peripheral: Peripheral, options: [String: Any]?)
func cancelPeripheralConnection(_ identifier: Peripheral)
func cancelPeripheralConnection(_ peripheral: Peripheral)
}

extension CBCentralManager: CentralManager {
Expand All @@ -32,8 +32,8 @@ extension CBCentralManager: CentralManager {
connect(peripheral as! CBPeripheral, options: options)
}

func cancelPeripheralConnection(_ identifier: Peripheral) {
cancelPeripheralConnection(identifier as! CBPeripheral)
func cancelPeripheralConnection(_ peripheral: Peripheral) {
cancelPeripheralConnection(peripheral as! CBPeripheral)
}
}

Expand Down Expand Up @@ -241,6 +241,10 @@ final class BluetoothManager: NSObject {
connectingCadenceSensorUUID = cadenceSensor.identifier
centralManager.connect(cadenceSensor, options: nil)
}

func cancelConnection(_ peripheral: Peripheral) {
centralManager.cancelPeripheralConnection(peripheral)
}
}

extension BluetoothManager: CentralManagerDelegate {
Expand Down Expand Up @@ -303,6 +307,8 @@ extension BluetoothManager: CentralManagerDelegate {
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
centralManager(central as CentralManager, didFailToConnect: peripheral as Peripheral, error: error)
}

// TODO: 切断したときのデリゲートメソッドを実装する
}

extension BluetoothManager: PeripheralDelegate {
Expand Down
4 changes: 2 additions & 2 deletions Komusou/Mocks.swift
Expand Up @@ -74,10 +74,10 @@ class CentralManagerMock: CentralManager {

private(set) var cancelPeripheralConnectionCallCount = 0
var cancelPeripheralConnectionHandler: ((Peripheral) -> ())?
func cancelPeripheralConnection(_ identifier: Peripheral) {
func cancelPeripheralConnection(_ peripheral: Peripheral) {
cancelPeripheralConnectionCallCount += 1
if let cancelPeripheralConnectionHandler = cancelPeripheralConnectionHandler {
cancelPeripheralConnectionHandler(identifier)
cancelPeripheralConnectionHandler(peripheral)
}

}
Expand Down
51 changes: 30 additions & 21 deletions Komusou/Settings/SensorSettingView.swift
Expand Up @@ -13,11 +13,11 @@ struct SensorSettingView: View {
@State
private var isSpeedSensorSheetPresented = false
@State
private var speedSensorName: String?
private var connectedSpeedSensor: Peripheral?
@State
private var isCadenceSensorSheetPresented = false
@State
private var cadenceSensorName: String?
private var connectedCadenceSensor: Peripheral?
@State
private var isBluetoothEnabled = true

Expand All @@ -26,25 +26,25 @@ struct SensorSettingView: View {
SensorRow(
isSheetPresented: $isSpeedSensorSheetPresented,
sensorType: "スピードセンサー",
sensorName: speedSensorName ?? "未接続"
sensorName: connectedSpeedSensor?.name ?? "未接続"
) {
SensorSelectingView(isSheetPresented: $isSpeedSensorSheetPresented)
SensorSelectingView(isSheetPresented: $isSpeedSensorSheetPresented, connectedSensor: BluetoothManager.shared().connectedSpeedSensor)
}
SensorRow(
isSheetPresented: $isCadenceSensorSheetPresented,
sensorType: "ケイデンスセンサー",
sensorName: cadenceSensorName ?? "未接続"
sensorName: connectedCadenceSensor?.name ?? "未接続"
) {
SensorSelectingView(isSheetPresented: $isCadenceSensorSheetPresented)
SensorSelectingView(isSheetPresented: $isCadenceSensorSheetPresented, connectedSensor: BluetoothManager.shared().connectedCadenceSensor)
}
}
.listStyle(.insetGrouped)
.alert(isBluetoothDisabled: .constant(!isBluetoothEnabled))
.onReceive(BluetoothManager.shared().$connectedSpeedSensor.map { $0?.name }) { speedSensorName in
self.speedSensorName = speedSensorName
.onReceive(BluetoothManager.shared().$connectedSpeedSensor) { speedSensor in
self.connectedSpeedSensor = speedSensor
}
.onReceive(BluetoothManager.shared().$connectedCadenceSensor.map { $0?.name }) { cadenceSensorName in
self.cadenceSensorName = cadenceSensorName
.onReceive(BluetoothManager.shared().$connectedCadenceSensor) { cadenceSensor in
self.connectedCadenceSensor = cadenceSensor
}
.onReceive(BluetoothManager.shared().$isBluetoothEnabled) { isBluetoothEnabled in
self.isBluetoothEnabled = isBluetoothEnabled
Expand Down Expand Up @@ -81,17 +81,19 @@ struct SensorSelectingView: View {
private var state: SensorSelectingViewState
@State
private var sensorNames = [UUID: String]()
private var connectedSensor: Peripheral?

init(isSheetPresented: Binding<Bool>) {
init(isSheetPresented: Binding<Bool>, connectedSensor: Peripheral?) {
state = .init(isSheetPresented: isSheetPresented)
self.connectedSensor = connectedSensor
}

var body: some View {
List {
if true { // TODO: 接続済みのセンサーがあったらという条件
if let connectedSensor = connectedSensor {
Section {
Button {
// TODO: 切断する
state.cnacelConnection(connectedSensor)
} label: {
Text("切断する")
}
Expand All @@ -104,7 +106,16 @@ struct SensorSelectingView: View {
Button {
state.connectToSpeedSensor(uuid: key)
} label: {
Text(sensorName)
HStack {
Text(sensorName)
Spacer()
if let connectedSensor = connectedSensor,
key == connectedSensor.identifier
{
Image(systemName: "checkmark")
.foregroundColor(.blue)
}
}
}
}
}
Expand All @@ -125,12 +136,6 @@ struct SensorSelectingView: View {
}
}

struct SensorSelectingView_Preview: PreviewProvider {
static var previews: some View {
SensorSelectingView(isSheetPresented: .constant(true))
}
}

class SensorSelectingViewState: ObservableObject {
@Published
var didError = false
Expand All @@ -154,11 +159,15 @@ class SensorSelectingViewState: ObservableObject {
} receiveValue: { _ in }
.store(in: &cancellables)
}

func cnacelConnection(_ peripheral: Peripheral) {
BluetoothManager.shared().cancelConnection(peripheral)
}
}

struct SensorSettingView_Previews: PreviewProvider {
static var previews: some View {
SensorSelectingView(isSheetPresented: .constant(false))
SensorSelectingView(isSheetPresented: .constant(false), connectedSensor: nil)
.previewLayout(.sizeThatFits)
}
}
Expand Down

0 comments on commit bcc5ee9

Please sign in to comment.