mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
250 lines
5.9 KiB
Swift
250 lines
5.9 KiB
Swift
//
|
|
// PositionConfig.swift
|
|
// Meshtastic Apple
|
|
//
|
|
// Copyright (c) Garth Vander Houwen 6/11/22.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
enum GpsUpdateIntervals: Int, CaseIterable, Identifiable {
|
|
|
|
case thirtySeconds = 0
|
|
case oneMinute = 60
|
|
case fiveMinutes = 300
|
|
case tenMinutes = 600
|
|
case fifteenMinutes = 900
|
|
case thirtyMinutes = 1800
|
|
case oneHour = 3600
|
|
case maxInt32 = 2147483647
|
|
|
|
var id: Int { self.rawValue }
|
|
var description: String {
|
|
get {
|
|
switch self {
|
|
|
|
case .thirtySeconds:
|
|
return "Thirty Seconds"
|
|
case .oneMinute:
|
|
return "One Minute"
|
|
case .fiveMinutes:
|
|
return "Five Minutes"
|
|
case .tenMinutes:
|
|
return "Ten Minutes"
|
|
case .fifteenMinutes:
|
|
return "Fifteen Minutes"
|
|
case .thirtyMinutes:
|
|
return "Thirty Minutes"
|
|
case .oneHour:
|
|
return "One Hour"
|
|
case .maxInt32:
|
|
return "On Boot Only"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
enum GpsAttemptTimes: Int, CaseIterable, Identifiable {
|
|
|
|
case thirtySeconds = 0
|
|
case oneMinute = 60
|
|
case fiveMinutes = 300
|
|
case tenMinutes = 600
|
|
case fifteenMinutes = 900
|
|
|
|
var id: Int { self.rawValue }
|
|
var description: String {
|
|
get {
|
|
switch self {
|
|
|
|
case .thirtySeconds:
|
|
return "Thirty Seconds"
|
|
case .oneMinute:
|
|
return "One Minute"
|
|
case .fiveMinutes:
|
|
return "Five Minutes"
|
|
case .tenMinutes:
|
|
return "Ten Minutes"
|
|
case .fifteenMinutes:
|
|
return "Fifteen Minutes"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
enum PositionBroadcastIntervals: Int, CaseIterable, Identifiable {
|
|
|
|
case thirtySeconds = 30
|
|
case oneMinute = 60
|
|
case fiveMinutes = 300
|
|
case tenMinutes = 600
|
|
case fifteenMinutes = 0
|
|
case thirtyMinutes = 1800
|
|
case oneHour = 3600
|
|
|
|
var id: Int { self.rawValue }
|
|
var description: String {
|
|
get {
|
|
switch self {
|
|
|
|
case .thirtySeconds:
|
|
return "Thirty Seconds"
|
|
case .oneMinute:
|
|
return "One Minute"
|
|
case .fiveMinutes:
|
|
return "Five Minutes"
|
|
case .tenMinutes:
|
|
return "Ten Minutes"
|
|
case .fifteenMinutes:
|
|
return "Fifteen Minutes"
|
|
case .thirtyMinutes:
|
|
return "Thirty Minutes"
|
|
case .oneHour:
|
|
return "One Hour"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct PositionConfig: View {
|
|
|
|
@Environment(\.managedObjectContext) var context
|
|
@EnvironmentObject var bleManager: BLEManager
|
|
|
|
@State var smartPositionEnabled = true
|
|
@State var deviceGpsEnabled = true
|
|
@State var fixedPosition = false
|
|
@State var gpsUpdateInterval = 0
|
|
@State var gpsAttemptTime = 0
|
|
@State var positionBroadcastSeconds = 0
|
|
|
|
@State var includeAltitude = false
|
|
@State var includeSatInView = false
|
|
|
|
var body: some View {
|
|
|
|
VStack {
|
|
|
|
Form {
|
|
|
|
Section(header: Text("Device GPS")) {
|
|
|
|
Toggle(isOn: $deviceGpsEnabled) {
|
|
|
|
Label("Device GPS Enabled", systemImage: "location")
|
|
}
|
|
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
|
|
if deviceGpsEnabled {
|
|
|
|
Picker("Update Interval", selection: $gpsUpdateInterval) {
|
|
ForEach(GpsUpdateIntervals.allCases) { ui in
|
|
Text(ui.description)
|
|
}
|
|
}
|
|
.pickerStyle(DefaultPickerStyle())
|
|
|
|
Text("How often should we try to get a GPS position.")
|
|
.font(.caption)
|
|
.listRowSeparator(.visible)
|
|
|
|
Picker("Attempt Time", selection: $gpsAttemptTime) {
|
|
ForEach(GpsAttemptTimes.allCases) { at in
|
|
Text(at.description)
|
|
}
|
|
}
|
|
.pickerStyle(DefaultPickerStyle())
|
|
|
|
Text("How long should we try to get our position during each GPS Update Interval attempt?")
|
|
.font(.caption)
|
|
.listRowSeparator(.visible)
|
|
|
|
|
|
} else {
|
|
|
|
Toggle(isOn: $fixedPosition) {
|
|
|
|
Label("Fixed Position", systemImage: "location.square.fill")
|
|
}
|
|
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
|
|
if fixedPosition {
|
|
|
|
Text("Set to current location here")
|
|
.font(.caption)
|
|
.listRowSeparator(.visible)
|
|
}
|
|
|
|
}
|
|
}
|
|
Section(header: Text("Position Packet")) {
|
|
|
|
Toggle(isOn: $smartPositionEnabled) {
|
|
|
|
Label("Smart Position Broadcast", systemImage: "location.fill.viewfinder")
|
|
}
|
|
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
|
|
if !smartPositionEnabled {
|
|
|
|
Picker("Position Broadcast Interval", selection: $positionBroadcastSeconds) {
|
|
ForEach(PositionBroadcastIntervals.allCases) { at in
|
|
Text(at.description)
|
|
}
|
|
}
|
|
.pickerStyle(DefaultPickerStyle())
|
|
|
|
Text("We should send our position this often (but only if it has changed significantly)")
|
|
.font(.caption)
|
|
.listRowSeparator(.visible)
|
|
|
|
}
|
|
}
|
|
Section(header: Text("Position Flags")) {
|
|
|
|
Text("Optional fields to include when assembling position messages. the more fields are included, the larger the message will be - leading to longer airtime and a higher risk of packet loss")
|
|
.font(.caption)
|
|
.listRowSeparator(.visible)
|
|
|
|
Toggle(isOn: $includeAltitude) {
|
|
|
|
Label("Include Altitude", systemImage: "arrow.up")
|
|
}
|
|
.toggleStyle(DefaultToggleStyle())
|
|
.listRowSeparator(.visible)
|
|
|
|
Toggle(isOn: $includeSatInView) {
|
|
|
|
Label("Include number of satellites in view", systemImage: "skew")
|
|
}
|
|
.toggleStyle(DefaultToggleStyle())
|
|
.listRowSeparator(.visible)
|
|
|
|
Toggle(isOn: $includeSatInView) { //64
|
|
|
|
Label("Include a sequence number incremented per packet", systemImage: "number")
|
|
}
|
|
.toggleStyle(DefaultToggleStyle())
|
|
.listRowSeparator(.visible)
|
|
|
|
Toggle(isOn: $includeSatInView) { //128
|
|
|
|
Label("Include positional timestamp", systemImage: "clock")
|
|
}
|
|
.toggleStyle(DefaultToggleStyle())
|
|
.listRowSeparator(.visible)
|
|
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Position Config")
|
|
.navigationBarItems(trailing:
|
|
|
|
ZStack {
|
|
|
|
ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.lastFourCode : "????")
|
|
})
|
|
.onAppear {
|
|
|
|
self.bleManager.context = context
|
|
}
|
|
.navigationViewStyle(StackNavigationViewStyle())
|
|
}
|
|
}
|