Meshtastic-Apple/Meshtastic/Views/Settings/Config/BluetoothConfig.swift
2022-08-18 08:46:10 -07:00

174 lines
4 KiB
Swift

//
// BluetoothConfig.swift
// Meshtastic Apple
//
// Copyright (c) Garth Vander Houwen 8/18/22.
//
import SwiftUI
enum BluetoothModes: Int, CaseIterable, Identifiable {
case randomPin = 0
case fixedPin = 1
case noPin = 2
var id: Int { self.rawValue }
var description: String {
get {
switch self {
case .randomPin:
return "Random"
case .fixedPin:
return "Fixed"
case .noPin:
return "None"
}
}
}
func protoEnumValue() -> Config.BluetoothConfig.PairingMode {
switch self {
case .randomPin:
return Config.BluetoothConfig.PairingMode.randomPin
case .fixedPin:
return Config.BluetoothConfig.PairingMode.fixedPin
case .noPin:
return Config.BluetoothConfig.PairingMode.noPin
}
}
}
struct BluetoothConfig: View {
@Environment(\.managedObjectContext) var context
@EnvironmentObject var bleManager: BLEManager
var node: NodeInfoEntity?
@State private var isPresentingSaveConfirm: Bool = false
@State var initialLoad: Bool = true
@State var hasChanges = false
@State var enabled = true
/// Determines the pairing strategy for the device
@State var mode = 0
/// Specified pin for PairingMode.FixedPin
@State var fixedPin = 123456
var body: some View {
VStack {
Form {
Section(header: Text("Options")) {
Toggle(isOn: $enabled) {
Label("Enabled", systemImage: "antenna.radiowaves.left.and.right")
}
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
Picker("Pairing PIN", selection: $mode ) {
ForEach(BluetoothModes.allCases) { bm in
Text(bm.description)
}
}
.pickerStyle(DefaultPickerStyle())
if mode == 2 {
}
}
}
.disabled(bleManager.connectedPeripheral == nil)
Button {
isPresentingSaveConfirm = true
} label: {
Label("Save", systemImage: "square.and.arrow.down")
}
.disabled(bleManager.connectedPeripheral == nil || !hasChanges)
.buttonStyle(.bordered)
.buttonBorderShape(.capsule)
.controlSize(.large)
.padding()
.confirmationDialog(
"Are you sure?",
isPresented: $isPresentingSaveConfirm
) {
Button("Save Bluetooth Config to \(bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.longName : "Unknown")?") {
var bc = Config.BluetoothConfig()
bc.enabled = enabled
bc.mode = BluetoothModes(rawValue: mode)?.protoEnumValue() ?? Config.BluetoothConfig.PairingMode.randomPin
bc.fixedPin = UInt32(fixedPin)
let adminMessageId = 0//bleManager.saveBluetoothConfig(config: bc, fromUser: node!.user!, toUser: node!.user!)
if adminMessageId > 0 {
// Should show a saved successfully alert once I know that to be true
// for now just disable the button after a successful save
hasChanges = false
} else {
}
}
}
}
.navigationTitle("Display Config")
.navigationBarItems(trailing:
ZStack {
ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "????")
})
.onAppear {
if self.initialLoad{
self.bleManager.context = context
self.enabled = node!.bluetoothConfig?.enabled ?? true
self.mode = Int(node!.bluetoothConfig?.mode ?? 0)
self.fixedPin = Int(node!.bluetoothConfig?.fixedPin ?? 123456)
self.hasChanges = false
self.initialLoad = false
}
}
.onChange(of: enabled) { newEnabled in
if node != nil && node!.bluetoothConfig != nil {
if newEnabled != node!.bluetoothConfig!.enabled { hasChanges = true }
}
}
.onChange(of: mode) { newMode in
if node != nil && node!.bluetoothConfig != nil {
if newMode != node!.bluetoothConfig!.mode { hasChanges = true }
}
}
.onChange(of: fixedPin) { newFixedPin in
if node != nil && node!.bluetoothConfig != nil {
if newFixedPin != node!.bluetoothConfig!.fixedPin { hasChanges = true }
}
}
.navigationViewStyle(StackNavigationViewStyle())
}
}