2022-12-17 19:14:53 -08:00
|
|
|
//
|
2024-01-28 09:36:19 -08:00
|
|
|
// Channels.swift
|
|
|
|
|
// Meshtastic Apple
|
2022-12-17 19:14:53 -08:00
|
|
|
//
|
2022-12-29 16:27:06 -08:00
|
|
|
// Copyright(c) Garth Vander Houwen 4/8/22.
|
2022-12-17 19:14:53 -08:00
|
|
|
//
|
2024-02-16 21:11:57 -08:00
|
|
|
|
2022-12-29 16:27:06 -08:00
|
|
|
import CoreData
|
2024-02-23 16:08:01 -08:00
|
|
|
import MapKit
|
2024-06-07 22:09:20 -05:00
|
|
|
import MeshtasticProtobufs
|
2024-06-03 02:17:55 -07:00
|
|
|
import OSLog
|
2024-06-07 22:09:20 -05:00
|
|
|
import SwiftUI
|
2024-02-17 14:46:09 -08:00
|
|
|
import TipKit
|
2022-12-29 16:27:06 -08:00
|
|
|
|
|
|
|
|
func generateChannelKey(size: Int) -> String {
|
|
|
|
|
var keyData = Data(count: size)
|
|
|
|
|
_ = keyData.withUnsafeMutableBytes {
|
|
|
|
|
SecRandomCopyBytes(kSecRandomDefault, size, $0.baseAddress!)
|
|
|
|
|
}
|
|
|
|
|
return keyData.base64EncodedString()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct Channels: View {
|
2023-03-06 10:33:18 -08:00
|
|
|
|
2022-12-29 16:27:06 -08:00
|
|
|
@Environment(\.managedObjectContext) var context
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
@EnvironmentObject var accessoryManager: AccessoryManager
|
2022-12-29 16:27:06 -08:00
|
|
|
@Environment(\.dismiss) private var goBack
|
|
|
|
|
@Environment(\.sizeCategory) var sizeCategory
|
2025-09-13 14:13:20 -07:00
|
|
|
@Environment(\.colorScheme) private var colorScheme
|
2022-12-29 16:27:06 -08:00
|
|
|
|
|
|
|
|
var node: NodeInfoEntity?
|
2023-03-06 10:33:18 -08:00
|
|
|
|
2022-12-29 16:27:06 -08:00
|
|
|
@State var hasChanges = false
|
2024-02-16 21:11:57 -08:00
|
|
|
@State var hasValidKey = true
|
2022-12-29 16:27:06 -08:00
|
|
|
@State private var isPresentingSaveConfirm: Bool = false
|
2024-04-01 10:51:06 -07:00
|
|
|
@State var channelIndex: Int32 = 0
|
|
|
|
|
@State var channelName = ""
|
|
|
|
|
@State var channelKeySize = 16
|
|
|
|
|
@State var channelKey = "AQ=="
|
|
|
|
|
@State var channelRole = 0
|
|
|
|
|
@State var uplink = false
|
|
|
|
|
@State var downlink = false
|
|
|
|
|
@State var positionPrecision = 32.0
|
|
|
|
|
@State var preciseLocation = true
|
|
|
|
|
@State var positionsEnabled = true
|
|
|
|
|
@State var supportedVersion = true
|
2024-03-17 10:26:42 -07:00
|
|
|
@State var selectedChannel: ChannelEntity?
|
2024-05-29 16:40:07 -05:00
|
|
|
|
2024-02-23 23:18:48 -08:00
|
|
|
/// Minimum Version for granular position configuration
|
2024-02-24 16:25:08 -08:00
|
|
|
@State var minimumVersion = "2.2.24"
|
2025-06-22 20:19:42 -07:00
|
|
|
@State private var showingHelp = false
|
2024-05-29 16:40:07 -05:00
|
|
|
|
2024-04-03 13:33:55 -07:00
|
|
|
@FetchRequest(
|
|
|
|
|
sortDescriptors: [NSSortDescriptor(key: "favorite", ascending: false),
|
|
|
|
|
NSSortDescriptor(key: "lastHeard", ascending: false),
|
|
|
|
|
NSSortDescriptor(key: "user.longName", ascending: true)],
|
|
|
|
|
animation: .default)
|
|
|
|
|
|
|
|
|
|
var nodes: FetchedResults<NodeInfoEntity>
|
2023-03-06 10:33:18 -08:00
|
|
|
|
2022-12-29 16:27:06 -08:00
|
|
|
var body: some View {
|
2023-03-06 10:33:18 -08:00
|
|
|
|
2024-01-14 22:03:02 -08:00
|
|
|
VStack {
|
2022-12-29 16:27:06 -08:00
|
|
|
List {
|
2024-10-05 10:44:46 -07:00
|
|
|
TipView(CreateChannelsTip(), arrowEdge: .bottom)
|
2025-09-13 14:13:20 -07:00
|
|
|
.tipBackground(colorScheme == .dark ? Color(.systemBackground) : Color(.secondarySystemBackground))
|
|
|
|
|
.listRowSeparator(.hidden)
|
2022-12-29 16:27:06 -08:00
|
|
|
if node != nil && node?.myInfo != nil {
|
2023-03-14 13:01:35 -07:00
|
|
|
ForEach(node?.myInfo?.channels?.array as? [ChannelEntity] ?? [], id: \.self) { (channel: ChannelEntity) in
|
2023-03-06 10:33:18 -08:00
|
|
|
Button(action: {
|
2022-12-29 16:27:06 -08:00
|
|
|
channelIndex = channel.index
|
|
|
|
|
channelRole = Int(channel.role)
|
|
|
|
|
channelKey = channel.psk?.base64EncodedString() ?? ""
|
|
|
|
|
if channelKey.count == 0 {
|
|
|
|
|
channelKeySize = 0
|
|
|
|
|
} else if channelKey == "AQ==" {
|
|
|
|
|
channelKeySize = -1
|
2024-03-10 00:25:02 -08:00
|
|
|
} else if channelKey.count == 4 {
|
|
|
|
|
channelKeySize = 1
|
2022-12-29 16:27:06 -08:00
|
|
|
} else if channelKey.count == 24 {
|
|
|
|
|
channelKeySize = 16
|
|
|
|
|
} else if channelKey.count == 32 {
|
|
|
|
|
channelKeySize = 24
|
|
|
|
|
} else if channelKey.count == 44 {
|
|
|
|
|
channelKeySize = 32
|
|
|
|
|
}
|
|
|
|
|
channelName = channel.name ?? ""
|
|
|
|
|
uplink = channel.uplinkEnabled
|
|
|
|
|
downlink = channel.downlinkEnabled
|
2024-03-17 10:08:03 -07:00
|
|
|
positionPrecision = Double(channel.positionPrecision)
|
2024-02-23 23:18:48 -08:00
|
|
|
if !supportedVersion && channelRole == 1 {
|
2024-02-24 14:11:03 -08:00
|
|
|
positionPrecision = 32
|
2024-02-23 23:18:48 -08:00
|
|
|
preciseLocation = true
|
|
|
|
|
positionsEnabled = true
|
2024-08-26 22:31:03 -07:00
|
|
|
if channelKey == "AQ==" {
|
2024-09-06 17:05:25 -07:00
|
|
|
positionPrecision = 14
|
2024-08-26 22:31:03 -07:00
|
|
|
preciseLocation = false
|
|
|
|
|
}
|
2024-02-23 23:18:48 -08:00
|
|
|
} else if !supportedVersion && channelRole == 2 {
|
2024-02-24 14:11:03 -08:00
|
|
|
positionPrecision = 0
|
2024-02-23 23:18:48 -08:00
|
|
|
preciseLocation = false
|
|
|
|
|
positionsEnabled = false
|
2024-02-24 22:33:11 -08:00
|
|
|
} else {
|
2024-08-25 23:02:43 -07:00
|
|
|
if channelKey == "AQ==" {
|
|
|
|
|
preciseLocation = false
|
2024-09-06 17:05:25 -07:00
|
|
|
if (positionPrecision > 0 && positionPrecision < 11) || positionPrecision > 14 {
|
|
|
|
|
positionPrecision = 14
|
2024-08-25 23:02:43 -07:00
|
|
|
}
|
|
|
|
|
} else if positionPrecision == 32 {
|
2024-02-24 22:33:11 -08:00
|
|
|
preciseLocation = true
|
|
|
|
|
positionsEnabled = true
|
|
|
|
|
} else {
|
|
|
|
|
preciseLocation = false
|
|
|
|
|
}
|
|
|
|
|
if positionPrecision == 0 {
|
|
|
|
|
positionsEnabled = false
|
|
|
|
|
} else {
|
|
|
|
|
positionsEnabled = true
|
|
|
|
|
}
|
2024-02-23 23:18:48 -08:00
|
|
|
}
|
2024-03-17 10:08:03 -07:00
|
|
|
hasChanges = false
|
2024-03-17 10:26:42 -07:00
|
|
|
selectedChannel = channel
|
2022-12-29 16:27:06 -08:00
|
|
|
}) {
|
|
|
|
|
VStack(alignment: .leading) {
|
|
|
|
|
HStack {
|
2023-09-01 00:22:30 -07:00
|
|
|
CircleText(text: String(channel.index), color: .accentColor, circleSize: 45)
|
2022-12-29 16:27:06 -08:00
|
|
|
.padding(.trailing, 5)
|
2023-09-01 00:22:30 -07:00
|
|
|
.brightness(0.1)
|
2022-12-29 16:27:06 -08:00
|
|
|
VStack {
|
|
|
|
|
HStack {
|
2025-06-22 20:19:42 -07:00
|
|
|
ChannelLock(channel: channel)
|
2022-12-29 16:27:06 -08:00
|
|
|
if channel.name?.isEmpty ?? false {
|
|
|
|
|
if channel.role == 1 {
|
|
|
|
|
Text(String("PrimaryChannel").camelCaseToWords()).font(.headline)
|
|
|
|
|
} else {
|
|
|
|
|
Text(String("Channel \(channel.index)").camelCaseToWords()).font(.headline)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Text(String(channel.name ?? "Channel \(channel.index)").camelCaseToWords()).font(.headline)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-29 16:40:07 -05:00
|
|
|
.sheet(item: $selectedChannel) { _ in
|
2024-02-20 21:24:32 -08:00
|
|
|
#if targetEnvironment(macCatalyst)
|
2025-02-15 09:40:55 -08:00
|
|
|
Text("Channel")
|
2024-02-20 21:24:32 -08:00
|
|
|
.font(.largeTitle)
|
|
|
|
|
.padding()
|
|
|
|
|
#endif
|
2024-03-17 10:08:03 -07:00
|
|
|
ChannelForm(channelIndex: $channelIndex, channelName: $channelName, channelKeySize: $channelKeySize, channelKey: $channelKey, channelRole: $channelRole, uplink: $uplink, downlink: $downlink, positionPrecision: $positionPrecision, preciseLocation: $preciseLocation, positionsEnabled: $positionsEnabled, hasChanges: $hasChanges, hasValidKey: $hasValidKey, supportedVersion: $supportedVersion)
|
2024-04-02 06:17:03 -07:00
|
|
|
.presentationDetents([.large])
|
|
|
|
|
.presentationDragIndicator(.visible)
|
2024-08-23 19:49:06 -07:00
|
|
|
.onFirstAppear {
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
supportedVersion = accessoryManager.checkIsVersionSupported(forVersion: minimumVersion)
|
2024-02-20 21:24:32 -08:00
|
|
|
}
|
|
|
|
|
HStack {
|
|
|
|
|
Button {
|
|
|
|
|
var channel = Channel()
|
|
|
|
|
channel.index = channelIndex
|
|
|
|
|
channel.role = ChannelRoles(rawValue: channelRole)?.protoEnumValue() ?? .secondary
|
2023-01-04 10:05:08 -08:00
|
|
|
channel.index = channelIndex
|
2024-02-20 21:24:32 -08:00
|
|
|
channel.settings.name = channelName
|
|
|
|
|
channel.settings.psk = Data(base64Encoded: channelKey) ?? Data()
|
|
|
|
|
channel.settings.uplinkEnabled = uplink
|
|
|
|
|
channel.settings.downlinkEnabled = downlink
|
2024-02-24 14:11:03 -08:00
|
|
|
channel.settings.moduleSettings.positionPrecision = UInt32(positionPrecision)
|
2024-04-02 21:49:36 -07:00
|
|
|
selectedChannel!.role = Int32(channelRole)
|
|
|
|
|
selectedChannel!.index = channelIndex
|
|
|
|
|
selectedChannel!.name = channelName
|
|
|
|
|
selectedChannel!.psk = Data(base64Encoded: channelKey) ?? Data()
|
|
|
|
|
selectedChannel!.uplinkEnabled = uplink
|
|
|
|
|
selectedChannel!.downlinkEnabled = downlink
|
|
|
|
|
selectedChannel!.positionPrecision = Int32(positionPrecision)
|
2024-02-23 23:18:48 -08:00
|
|
|
|
2024-02-20 21:24:32 -08:00
|
|
|
guard let mutableChannels = node?.myInfo?.channels?.mutableCopy() as? NSMutableOrderedSet else {
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-04-01 10:51:06 -07:00
|
|
|
if mutableChannels.contains(selectedChannel as Any) {
|
2024-07-07 09:40:06 -07:00
|
|
|
let replaceChannel = mutableChannels.first(where: { selectedChannel?.psk == ($0 as AnyObject).psk && selectedChannel?.name == ($0 as AnyObject).name})
|
|
|
|
|
mutableChannels.replaceObject(at: mutableChannels.index(of: replaceChannel as Any), with: selectedChannel as Any)
|
2024-02-20 21:24:32 -08:00
|
|
|
} else {
|
2024-04-01 10:51:06 -07:00
|
|
|
mutableChannels.add(selectedChannel as Any)
|
2024-02-20 21:24:32 -08:00
|
|
|
}
|
2024-04-02 21:49:36 -07:00
|
|
|
node?.myInfo?.channels = mutableChannels.copy() as? NSOrderedSet
|
2024-04-01 12:16:09 -07:00
|
|
|
context.refresh(selectedChannel!, mergeChanges: true)
|
2024-07-02 09:28:55 -07:00
|
|
|
if channel.role != Channel.Role.disabled {
|
2024-02-20 21:24:32 -08:00
|
|
|
do {
|
|
|
|
|
try context.save()
|
2025-03-31 22:06:00 -07:00
|
|
|
Logger.data.info("💾 Saved Channel: \(channel.settings.name, privacy: .public)")
|
2024-02-20 21:24:32 -08:00
|
|
|
} catch {
|
|
|
|
|
context.rollback()
|
|
|
|
|
let nsError = error as NSError
|
2025-03-31 22:06:00 -07:00
|
|
|
Logger.data.error("Unresolved Core Data error in the channel editor. Error: \(nsError, privacy: .public)")
|
2024-02-20 21:24:32 -08:00
|
|
|
}
|
|
|
|
|
} else {
|
2024-07-02 09:28:55 -07:00
|
|
|
let objects = selectedChannel?.allPrivateMessages ?? []
|
2024-04-02 21:49:36 -07:00
|
|
|
for object in objects {
|
|
|
|
|
context.delete(object)
|
|
|
|
|
}
|
2024-07-02 09:28:55 -07:00
|
|
|
for node in nodes where node.channel == channel.index {
|
2024-06-02 18:32:14 -07:00
|
|
|
context.delete(node)
|
2024-04-03 13:33:55 -07:00
|
|
|
}
|
2024-07-02 09:28:55 -07:00
|
|
|
context.delete(selectedChannel!)
|
2024-04-02 21:49:36 -07:00
|
|
|
do {
|
|
|
|
|
try context.save()
|
2025-03-31 22:06:00 -07:00
|
|
|
Logger.data.info("💾 Deleted Channel: \(channel.settings.name, privacy: .public)")
|
2024-04-02 21:49:36 -07:00
|
|
|
} catch {
|
|
|
|
|
context.rollback()
|
|
|
|
|
let nsError = error as NSError
|
2025-03-31 22:06:00 -07:00
|
|
|
Logger.data.error("Unresolved Core Data error in the channel editor. Error: \(nsError, privacy: .public)")
|
2023-01-04 10:05:08 -08:00
|
|
|
}
|
2024-02-20 21:24:32 -08:00
|
|
|
}
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
Task {
|
|
|
|
|
_ = try await accessoryManager.saveChannel(channel: channel, fromUser: node!.user!, toUser: node!.user!)
|
|
|
|
|
Task { @MainActor in
|
|
|
|
|
selectedChannel = nil
|
|
|
|
|
channelName = ""
|
|
|
|
|
channelRole = 2
|
|
|
|
|
hasChanges = false
|
|
|
|
|
}
|
2025-12-09 22:46:14 -08:00
|
|
|
accessoryManager.mqttManager.connectFromConfigSettings(node: node!)
|
2022-12-29 16:27:06 -08:00
|
|
|
}
|
2024-02-20 21:24:32 -08:00
|
|
|
} label: {
|
2025-05-05 09:35:30 -07:00
|
|
|
Label("Save", systemImage: "square.and.arrow.down")
|
2024-02-20 21:24:32 -08:00
|
|
|
}
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
.disabled(!accessoryManager.isConnected)// || !hasChanges)// !hasValidKey)
|
2024-02-20 21:24:32 -08:00
|
|
|
.buttonStyle(.bordered)
|
|
|
|
|
.buttonBorderShape(.capsule)
|
|
|
|
|
.controlSize(.large)
|
|
|
|
|
.padding(.bottom)
|
|
|
|
|
#if targetEnvironment(macCatalyst)
|
|
|
|
|
Button {
|
2024-03-17 10:26:42 -07:00
|
|
|
goBack()
|
2024-02-20 21:24:32 -08:00
|
|
|
} label: {
|
2025-04-27 11:26:23 -07:00
|
|
|
Label("Close", systemImage: "xmark")
|
2022-12-29 16:27:06 -08:00
|
|
|
}
|
2024-02-20 21:24:32 -08:00
|
|
|
.buttonStyle(.bordered)
|
|
|
|
|
.buttonBorderShape(.capsule)
|
|
|
|
|
.controlSize(.large)
|
|
|
|
|
.padding(.bottom)
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if node?.myInfo?.channels?.array.count ?? 0 < 8 && node != nil {
|
|
|
|
|
|
|
|
|
|
Button {
|
|
|
|
|
let channelIndexes = node?.myInfo?.channels?.compactMap({(ch) -> Int in
|
|
|
|
|
return (ch as AnyObject).index
|
|
|
|
|
})
|
2024-02-21 17:42:46 -08:00
|
|
|
let firstChannelIndex = firstMissingChannelIndex(channelIndexes ?? [])
|
2024-02-20 21:24:32 -08:00
|
|
|
channelKeySize = 16
|
|
|
|
|
let key = generateChannelKey(size: channelKeySize)
|
|
|
|
|
channelName = ""
|
|
|
|
|
channelIndex = Int32(firstChannelIndex)
|
|
|
|
|
channelRole = 2
|
|
|
|
|
channelKey = key
|
2024-02-24 14:11:03 -08:00
|
|
|
positionsEnabled = false
|
2024-02-24 16:25:08 -08:00
|
|
|
preciseLocation = false
|
2024-09-05 19:31:29 -07:00
|
|
|
positionPrecision = 0
|
2024-02-20 21:24:32 -08:00
|
|
|
uplink = false
|
|
|
|
|
downlink = false
|
2024-05-29 16:40:07 -05:00
|
|
|
|
2024-04-01 10:51:06 -07:00
|
|
|
let newChannel = ChannelEntity(context: context)
|
|
|
|
|
newChannel.id = channelIndex
|
|
|
|
|
newChannel.index = channelIndex
|
|
|
|
|
newChannel.uplinkEnabled = uplink
|
|
|
|
|
newChannel.downlinkEnabled = downlink
|
|
|
|
|
newChannel.name = channelName
|
|
|
|
|
newChannel.role = Int32(channelRole)
|
2024-04-01 12:16:09 -07:00
|
|
|
newChannel.psk = Data(base64Encoded: channelKey) ?? Data()
|
2024-04-01 10:51:06 -07:00
|
|
|
newChannel.positionPrecision = Int32(positionPrecision)
|
|
|
|
|
selectedChannel = newChannel
|
2024-09-05 19:31:29 -07:00
|
|
|
hasChanges = true
|
2024-02-20 21:24:32 -08:00
|
|
|
|
|
|
|
|
} label: {
|
|
|
|
|
Label("Add Channel", systemImage: "plus.square")
|
2022-12-29 16:27:06 -08:00
|
|
|
}
|
2024-02-20 21:24:32 -08:00
|
|
|
.buttonStyle(.bordered)
|
|
|
|
|
.buttonBorderShape(.capsule)
|
|
|
|
|
.controlSize(.large)
|
|
|
|
|
.padding()
|
2022-12-29 16:27:06 -08:00
|
|
|
}
|
|
|
|
|
}
|
2025-06-22 20:19:42 -07:00
|
|
|
.sheet(isPresented: $showingHelp) {
|
|
|
|
|
ChannelsHelp()
|
|
|
|
|
.presentationDetents([.large])
|
|
|
|
|
.presentationDragIndicator(.visible)
|
|
|
|
|
}
|
|
|
|
|
.safeAreaInset(edge: .bottom, alignment: .leading) {
|
|
|
|
|
HStack {
|
|
|
|
|
Button(action: {
|
|
|
|
|
withAnimation {
|
|
|
|
|
showingHelp = !showingHelp
|
|
|
|
|
}
|
|
|
|
|
}) {
|
|
|
|
|
Image(systemName: !showingHelp ? "questionmark.circle" : "questionmark.circle.fill")
|
|
|
|
|
.padding(.vertical, 5)
|
|
|
|
|
}
|
|
|
|
|
.tint(Color(UIColor.secondarySystemBackground))
|
|
|
|
|
.foregroundColor(.accentColor)
|
|
|
|
|
.buttonStyle(.borderedProminent)
|
|
|
|
|
}
|
|
|
|
|
.controlSize(.regular)
|
|
|
|
|
.padding(5)
|
|
|
|
|
}
|
|
|
|
|
.padding(.bottom, 5)
|
2025-04-27 09:32:59 -07:00
|
|
|
.navigationTitle("Channels")
|
2022-12-29 16:27:06 -08:00
|
|
|
.navigationBarItems(trailing:
|
|
|
|
|
ZStack {
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
ConnectedDevice(deviceConnected: accessoryManager.isConnected, name: accessoryManager.activeConnection?.device.shortName ?? "?")
|
2022-12-29 16:27:06 -08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-02-20 19:20:21 -08:00
|
|
|
|
|
|
|
|
func firstMissingChannelIndex(_ indexes: [Int]) -> Int {
|
2024-06-02 18:32:14 -07:00
|
|
|
let smallestIndex = 1
|
2024-04-19 13:36:17 -07:00
|
|
|
if indexes.isEmpty { return smallestIndex }
|
|
|
|
|
if smallestIndex <= indexes.count {
|
2024-05-29 16:40:07 -05:00
|
|
|
for element in smallestIndex...indexes.count where !indexes.contains(element) {
|
|
|
|
|
return element
|
2024-02-20 19:20:21 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return indexes.count + 1
|
|
|
|
|
}
|
2024-02-23 16:08:01 -08:00
|
|
|
|
|
|
|
|
enum PositionPrecision: Int, CaseIterable, Identifiable {
|
|
|
|
|
|
2024-05-04 16:03:38 -07:00
|
|
|
case two = 2
|
|
|
|
|
case three = 3
|
|
|
|
|
case four = 4
|
|
|
|
|
case five = 5
|
|
|
|
|
case six = 6
|
|
|
|
|
case seven = 7
|
|
|
|
|
case eight = 8
|
|
|
|
|
case nine = 9
|
|
|
|
|
case ten = 10
|
2024-02-23 16:08:01 -08:00
|
|
|
case eleven = 11
|
|
|
|
|
case twelve = 12
|
|
|
|
|
case thirteen = 13
|
|
|
|
|
case fourteen = 14
|
|
|
|
|
case fifteen = 15
|
|
|
|
|
case sixteen = 16
|
2024-05-04 16:03:38 -07:00
|
|
|
case seventeen = 17
|
|
|
|
|
case eightteen = 18
|
|
|
|
|
case nineteen = 19
|
|
|
|
|
case twenty = 20
|
|
|
|
|
case twentyone = 21
|
|
|
|
|
case twentytwo = 22
|
|
|
|
|
case twentythree = 23
|
|
|
|
|
case twentyfour = 24
|
2024-02-23 16:08:01 -08:00
|
|
|
|
|
|
|
|
var id: Int { self.rawValue }
|
2024-05-29 16:40:07 -05:00
|
|
|
|
2024-02-23 16:08:01 -08:00
|
|
|
var precisionMeters: Double {
|
|
|
|
|
switch self {
|
2024-05-04 16:03:38 -07:00
|
|
|
case .two:
|
|
|
|
|
return 5976446.981252
|
|
|
|
|
case .three:
|
|
|
|
|
return 2988223.4850600003
|
|
|
|
|
case .four:
|
|
|
|
|
return 1494111.7369640006
|
|
|
|
|
case .five:
|
|
|
|
|
return 747055.8629159998
|
|
|
|
|
case .six:
|
|
|
|
|
return 373527.9258920002
|
|
|
|
|
case .seven:
|
|
|
|
|
return 186763.95738000044
|
|
|
|
|
case .eight:
|
|
|
|
|
return 93381.97312400135
|
|
|
|
|
case .nine:
|
|
|
|
|
return 46690.98099600022
|
|
|
|
|
case .ten:
|
|
|
|
|
return 23345.48493200123
|
2024-02-23 16:08:01 -08:00
|
|
|
case .eleven:
|
|
|
|
|
return 11672.736900000944
|
|
|
|
|
case .twelve:
|
|
|
|
|
return 5836.362884000802
|
|
|
|
|
case .thirteen:
|
|
|
|
|
return 2918.1758760007315
|
|
|
|
|
case .fourteen:
|
|
|
|
|
return 1459.0823719999053
|
|
|
|
|
case .fifteen:
|
|
|
|
|
return 729.5356200010741
|
|
|
|
|
case .sixteen:
|
|
|
|
|
return 364.7622440000765
|
2024-05-04 16:03:38 -07:00
|
|
|
case .seventeen:
|
|
|
|
|
return 182.37555600115968
|
|
|
|
|
case .eightteen:
|
|
|
|
|
return 91.1822120001193
|
|
|
|
|
case .nineteen:
|
|
|
|
|
return 45.58554000039009
|
|
|
|
|
case .twenty:
|
|
|
|
|
return 22.787204001316468
|
|
|
|
|
case .twentyone:
|
|
|
|
|
return 11.388036000988677
|
|
|
|
|
case .twentytwo:
|
|
|
|
|
return 5.688452000824781
|
|
|
|
|
case .twentythree:
|
|
|
|
|
return 2.8386600007428338
|
|
|
|
|
case .twentyfour:
|
|
|
|
|
return 1.413763999910884
|
2024-02-23 16:08:01 -08:00
|
|
|
}
|
|
|
|
|
}
|
2024-05-29 16:40:07 -05:00
|
|
|
|
2024-02-23 16:08:01 -08:00
|
|
|
var description: String {
|
|
|
|
|
let distanceFormatter = MKDistanceFormatter()
|
2025-05-08 14:42:11 -07:00
|
|
|
return String.localizedStringWithFormat("Within %@".localized, String(distanceFormatter.string(fromDistance: precisionMeters)))
|
2024-02-23 16:08:01 -08:00
|
|
|
}
|
|
|
|
|
}
|