2022-06-13 20:43:51 -07:00
//
// D e v i c e C o n f i g . s w i f t
// M e s h t a s t i c A p p l e
//
// C o p y r i g h t ( c ) G a r t h V a n d e r H o u w e n 6 / 1 3 / 2 2 .
//
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
2022-06-13 20:43:51 -07:00
struct DeviceConfig : View {
2025-10-05 17:51:18 -07:00
2022-06-13 20:43:51 -07: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-09 18:19:00 -08:00
@ Environment ( \ . dismiss ) private var goBack
2025-10-05 17:51:18 -07:00
2022-07-07 00:29:52 -07:00
var node : NodeInfoEntity ?
2025-10-05 17:51:18 -07:00
2022-10-03 21:19:10 -07:00
@ State private var isPresentingNodeDBResetConfirm = false
2022-07-26 21:52:36 -07:00
@ State private var isPresentingFactoryResetConfirm = false
2022-06-21 02:43:37 -07:00
@ State var hasChanges = false
2022-06-13 20:43:51 -07:00
@ State var deviceRole = 0
2022-12-05 19:47:56 -08:00
@ State var buzzerGPIO = 0
@ State var buttonGPIO = 0
2023-03-05 23:01:09 -08:00
@ State var rebroadcastMode = 0
2025-10-05 17:51:18 -07:00
@ State private var nodeInfoBroadcastSecs : UpdateInterval = UpdateInterval ( from : 10800 )
2023-04-09 23:04:11 -07:00
@ State var doubleTapAsButtonPress = false
2024-04-26 18:06:23 -07:00
@ State var ledHeartbeatEnabled = true
2024-10-04 19:36:30 -07:00
@ State var tripleClickAsAdHocPing = true
2024-04-08 11:41:54 -07:00
@ State var tzdef = " "
2025-12-11 00:27:44 -05:00
@ State private var showSpecialRoleWarning = false
@ State private var showSpecialRoleWarningForRole : Int = 0
2022-06-13 20:43:51 -07:00
var body : some View {
2025-10-05 17:51:18 -07:00
Form {
ConfigHeader ( title : " Device " , config : \ . deviceConfig , node : node , onAppear : setDeviceValues )
Section ( header : Text ( " Options " ) ) {
VStack ( alignment : . leading ) {
Picker ( " Device Role " , selection : $ deviceRole ) {
ForEach ( DeviceRoles . allCases ) { dr in
Text ( dr . name ) . tag ( dr . rawValue as Int )
2025-03-04 21:38:35 -08:00
}
2022-06-13 20:43:51 -07:00
}
2025-10-05 17:51:18 -07:00
. onChange ( of : deviceRole ) { _ , newRole in
2025-12-11 00:27:44 -05:00
if hasChanges && [ DeviceRoles . router . rawValue , DeviceRoles . routerLate . rawValue , DeviceRoles . clientBase . rawValue ] . contains ( newRole ) {
showSpecialRoleWarningForRole = newRole
showSpecialRoleWarning = true
2023-03-05 23:01:09 -08:00
}
}
2025-10-05 17:51:18 -07:00
. confirmationDialog (
" Are you sure? " ,
2025-12-11 00:27:44 -05:00
isPresented : $ showSpecialRoleWarning ,
2025-10-05 17:51:18 -07:00
titleVisibility : . visible
) {
Button ( " Confirm " ) {
hasChanges = true
2024-02-12 22:09:22 -08:00
}
2025-10-05 17:51:18 -07:00
Button ( " Cancel " , role : . cancel ) {
setDeviceValues ( )
}
} message : {
2025-12-11 00:27:44 -05:00
Text ( specialRoleWarningMessage ( newRole : showSpecialRoleWarningForRole ) )
2024-02-12 22:09:22 -08:00
}
2025-10-05 17:51:18 -07:00
Text ( DeviceRoles ( rawValue : deviceRole ) ? . description ? ? " " )
. foregroundColor ( . gray )
. font ( . callout )
2024-04-26 18:06:23 -07:00
}
2025-10-05 17:51:18 -07:00
. pickerStyle ( DefaultPickerStyle ( ) )
VStack ( alignment : . leading ) {
Picker ( " Rebroadcast Mode " , selection : $ rebroadcastMode ) {
ForEach ( RebroadcastModes . allCases ) { rm in
Text ( rm . name )
}
2023-05-13 20:50:20 -07:00
}
2025-10-05 17:51:18 -07:00
Text ( RebroadcastModes ( rawValue : rebroadcastMode ) ? . description ? ? " " )
. foregroundColor ( . gray )
. font ( . callout )
2022-06-20 00:13:04 -07:00
}
2025-10-05 17:51:18 -07:00
UpdateIntervalPicker (
config : . broadcastLong ,
pickerLabel : " Node Info Broadcast Interval " ,
selectedInterval : $ nodeInfoBroadcastSecs
)
}
Section ( header : Text ( " Hardware " ) ) {
Toggle ( isOn : $ doubleTapAsButtonPress ) {
Label ( " Double Tap as Button " , systemImage : " hand.tap " )
Text ( " Treat double tap on supported accelerometers as a user button press. " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Toggle ( isOn : $ tripleClickAsAdHocPing ) {
Label ( " Triple Click Ad Hoc Ping " , systemImage : " mappin " )
Text ( " Send a position on the primary channel when the user button is triple clicked. " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Toggle ( isOn : $ ledHeartbeatEnabled ) {
Label ( " LED Heartbeat " , systemImage : " waveform.path.ecg " )
Text ( " Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable. " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
}
Section ( header : Text ( " Debug " ) ) {
VStack ( alignment : . leading ) {
HStack {
Label ( " Time Zone " , systemImage : " clock.badge.exclamationmark " )
TextField ( " Time Zone " , text : $ tzdef , axis : . vertical )
. foregroundColor ( . gray )
. onChange ( of : tzdef ) {
var totalBytes = tzdef . utf8 . count
// O n l y m e s s w i t h t h e v a l u e i f i t i s t o o b i g
while totalBytes > 63 {
tzdef = String ( tzdef . dropLast ( ) )
totalBytes = tzdef . utf8 . count
2024-10-04 19:36:30 -07:00
}
2025-10-05 17:51:18 -07:00
}
2024-04-08 11:41:54 -07:00
. foregroundColor ( . gray )
}
2025-10-05 17:51:18 -07:00
. keyboardType ( . default )
. disableAutocorrection ( true )
Text ( " Time zone for dates on the device screen and log. " )
. foregroundColor ( . gray )
. font ( . callout )
2022-06-18 00:08:01 -07:00
}
2025-10-05 17:51:18 -07:00
}
Section ( header : Text ( " GPIO " ) ) {
Picker ( " Button GPIO " , selection : $ buttonGPIO ) {
ForEach ( 0. . < 49 ) {
if $0 = = 0 {
Text ( " Unset " )
} else {
Text ( " Pin \( $0 ) " )
2022-12-05 19:47:56 -08:00
}
}
2025-10-05 17:51:18 -07:00
}
. pickerStyle ( DefaultPickerStyle ( ) )
Picker ( " Buzzer GPIO " , selection : $ buzzerGPIO ) {
ForEach ( 0. . < 49 ) {
if $0 = = 0 {
Text ( " Unset " )
} else {
Text ( " Pin \( $0 ) " )
2022-12-05 19:47:56 -08:00
}
}
}
2025-10-05 17:51:18 -07:00
. pickerStyle ( DefaultPickerStyle ( ) )
2022-06-20 00:13:04 -07:00
}
2025-10-05 17:51:18 -07:00
}
. disabled ( ! accessoryManager . isConnected || node ? . deviceConfig = = nil )
. safeAreaInset ( edge : . bottom , alignment : . center ) {
VStack ( spacing : 0 ) {
// O n l y s h o w t h e s e b u t t o n s f o r t h e B L E c o n n e c t e d n o d e
if accessoryManager . isConnected , let device = accessoryManager . activeConnection ? . device , node ? . num ? ? - 1 = = device . num {
HStack {
Button ( " Reset NodeDB " , role : . destructive ) {
isPresentingNodeDBResetConfirm = true
}
. disabled ( node ? . user = = nil )
. buttonStyle ( . borderedProminent )
. buttonBorderShape ( . capsule )
. confirmationDialog (
" Are you sure? " ,
isPresented : $ isPresentingNodeDBResetConfirm ,
titleVisibility : . visible
) {
Button ( " Erase all device and app data? " , role : . destructive ) {
Task {
do {
try await accessoryManager . sendNodeDBReset ( fromUser : node ! . user ! , toUser : node ! . user ! )
try await Task . sleep ( for : . seconds ( 1 ) )
try await accessoryManager . disconnect ( )
clearCoreDataDatabase ( context : context , includeRoutes : false )
clearNotifications ( )
} catch {
Logger . mesh . error ( " NodeDB Reset Failed " )
}
2023-11-20 16:08:46 -08:00
}
2023-02-02 22:03:27 -08:00
}
2022-10-02 09:19:03 -07:00
}
2025-10-05 17:51:18 -07:00
Button ( " Factory Reset " , role : . destructive ) {
isPresentingFactoryResetConfirm = true
}
. disabled ( node ? . user = = nil )
. buttonStyle ( . borderedProminent )
. buttonBorderShape ( . capsule )
. confirmationDialog (
" Factory reset will delete device and app data. " ,
isPresented : $ isPresentingFactoryResetConfirm ,
titleVisibility : . visible
) {
Button ( " Delete all config? " , role : . destructive ) {
Task {
do {
try await accessoryManager . sendFactoryReset ( fromUser : node ! . user ! , toUser : node ! . user ! )
try await Task . sleep ( for : . seconds ( 1 ) )
try await accessoryManager . disconnect ( )
clearCoreDataDatabase ( context : context , includeRoutes : false )
clearNotifications ( )
} catch {
Logger . mesh . error ( " Factory Reset Failed " )
}
2023-11-20 19:20:54 -08:00
}
2023-02-02 22:03:27 -08:00
}
2025-10-05 17:51:18 -07:00
Button ( " Delete all config, keys and BLE bonds? " , role : . destructive ) {
Task {
do {
try await accessoryManager . sendFactoryReset ( fromUser : node ! . user ! , toUser : node ! . user ! , resetDevice : true )
try ? await Task . sleep ( for : . seconds ( 1 ) )
try await accessoryManager . disconnect ( )
clearCoreDataDatabase ( context : context , includeRoutes : false )
clearNotifications ( )
} catch {
Logger . mesh . error ( " Factory Reset Failed " )
}
2025-06-12 08:43:07 -07:00
}
}
}
2022-10-02 09:19:03 -07:00
}
2025-10-05 17:51:18 -07:00
. padding ( . bottom )
2022-10-02 09:19:03 -07:00
}
2025-10-05 17:51:18 -07:00
HStack ( spacing : 0 ) {
SaveConfigButton ( node : node , hasChanges : $ hasChanges ) {
if let deviceNum = accessoryManager . activeDeviceNum ,
let connectedNode = getNodeInfo ( id : deviceNum , context : context ) {
var dc = Config . DeviceConfig ( )
dc . role = DeviceRoles ( rawValue : deviceRole ) ! . protoEnumValue ( )
dc . buttonGpio = UInt32 ( buttonGPIO )
dc . buzzerGpio = UInt32 ( buzzerGPIO )
dc . rebroadcastMode = RebroadcastModes ( rawValue : rebroadcastMode ) ? . protoEnumValue ( ) ? ? RebroadcastModes . all . protoEnumValue ( )
dc . nodeInfoBroadcastSecs = UInt32 ( nodeInfoBroadcastSecs . intValue )
dc . doubleTapAsButtonPress = doubleTapAsButtonPress
dc . disableTripleClick = ! tripleClickAsAdHocPing
dc . tzdef = tzdef
dc . ledHeartbeatDisabled = ! ledHeartbeatEnabled
Task {
_ = try await accessoryManager . saveDeviceConfig ( config : dc , fromUser : connectedNode . user ! , toUser : node ! . user ! )
Task { @ MainActor in
// S h o u l d s h o w a s a v e d s u c c e s s f u l l y a l e r t o n c e I k n o w t h a t t o b e t r u e
// f o r n o w j u s t d i s a b l e t h e b u t t o n a f t e r a s u c c e s s f u l s a v e
hasChanges = false
goBack ( )
}
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
}
2022-06-21 02:43:37 -07:00
}
2023-02-06 18:45:03 -08:00
}
2022-09-23 21:41:07 -07:00
}
2022-06-13 20:43:51 -07:00
}
2025-10-05 17:51:18 -07:00
. navigationTitle ( " Device Config " )
. navigationBarItems (
trailing : ZStack {
ConnectedDevice ( deviceConnected : accessoryManager . isConnected , name : accessoryManager . activeConnection ? . device . shortName ? ? " ? " )
}
)
2022-06-20 00:13:04 -07:00
}
2024-09-04 10:06:34 -07:00
. onFirstAppear {
2024-08-11 09:07:22 -07:00
// N e e d t o r e q u e s t a D e v i c e C o n f i g f r o m t h e r e m o t e n o d e b e f o r e a l l o w i n g c h a n g e s
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
if let deviceNum = accessoryManager . activeDeviceNum , let node {
let connectedNode = getNodeInfo ( id : deviceNum , context : context )
2024-09-04 10:06:34 -07:00
if let connectedNode {
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
if node . num != deviceNum {
2024-09-05 19:31:29 -07:00
if UserDefaults . enableAdministration {
// / 2 . 5 A d m i n i s t r a t i o n w i t h s e s s i o n p a s s k e y
let expiration = node . sessionExpiration ? ? Date ( )
if expiration < Date ( ) || node . deviceConfig = = nil {
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 {
do {
Logger . mesh . info ( " ⚙️ Empty or expired device config requesting via PKI admin " )
try await accessoryManager . requestDeviceConfig ( fromUser : connectedNode . user ! , toUser : node . user ! )
} catch {
Logger . mesh . error ( " 🚨 Device config request failed " )
}
}
2024-09-05 19:31:29 -07:00
}
} else {
if node . deviceConfig = = nil {
// / L e g a c y A d m i n i s t r a t i o n
2025-05-13 06:19:27 -07:00
Logger . mesh . info ( " ☠️ Using insecure legacy admin that is no longer supported, please upgrade your firmware. " )
2024-09-05 19:31:29 -07:00
}
2024-09-04 10:06:34 -07:00
}
}
2023-01-31 22:08:03 -08:00
}
}
2022-06-21 02:43:37 -07:00
}
2024-10-05 13:52:38 -07:00
. onChange ( of : deviceRole ) { oldRole , newRole in
if oldRole != newRole && newRole != node ? . deviceConfig ? . role ? ? - 1 { hasChanges = true }
2022-06-21 02:43:37 -07:00
}
2024-10-05 13:52:38 -07:00
. onChange ( of : buttonGPIO ) { oldButtonGPIO , newButtonGPIO in
if oldButtonGPIO != newButtonGPIO && newButtonGPIO != node ? . deviceConfig ? . buttonGpio ? ? - 1 { hasChanges = true }
2022-12-05 19:47:56 -08:00
}
2024-10-05 13:52:38 -07:00
. onChange ( of : buzzerGPIO ) { oldBuzzerGPIO , newBuzzerGPIO in
if oldBuzzerGPIO != newBuzzerGPIO && newBuzzerGPIO != node ? . deviceConfig ? . buzzerGpio ? ? - 1 { hasChanges = true }
2022-12-05 19:47:56 -08:00
}
2024-10-05 13:52:38 -07:00
. onChange ( of : rebroadcastMode ) { oldRebroadcastMode , newRebroadcastMode in
if oldRebroadcastMode != newRebroadcastMode && newRebroadcastMode != node ? . deviceConfig ? . rebroadcastMode ? ? - 1 { hasChanges = true }
2023-04-01 15:01:11 -07:00
}
2025-10-05 17:51:18 -07:00
. onChange ( of : nodeInfoBroadcastSecs . intValue ) { oldNodeInfoBroadcastSecs , newNodeInfoBroadcastSecs in
2024-10-06 08:50:12 -07:00
if oldNodeInfoBroadcastSecs != newNodeInfoBroadcastSecs && newNodeInfoBroadcastSecs != node ? . deviceConfig ? . nodeInfoBroadcastSecs ? ? - 1 { hasChanges = true }
2024-02-12 22:09:22 -08:00
}
2024-10-06 08:50:12 -07:00
. onChange ( of : doubleTapAsButtonPress ) { oldDoubleTapAsButtonPress , newDoubleTapAsButtonPress in
if oldDoubleTapAsButtonPress != newDoubleTapAsButtonPress && newDoubleTapAsButtonPress != node ? . deviceConfig ? . doubleTapAsButtonPress ? ? false { hasChanges = true }
2023-04-09 23:04:11 -07:00
}
2024-10-06 08:50:12 -07:00
. onChange ( of : tripleClickAsAdHocPing ) { oldTripleClickAsAdHocPing , newTripleClickAsAdHocPing in
if oldTripleClickAsAdHocPing != newTripleClickAsAdHocPing && newTripleClickAsAdHocPing != node ? . deviceConfig ? . tripleClickAsAdHocPing ? ? false { hasChanges = true }
2024-10-04 19:36:30 -07:00
}
2024-10-06 08:50:12 -07:00
. onChange ( of : tzdef ) { oldTzdef , newTzdef in
if oldTzdef != newTzdef && newTzdef != node ? . deviceConfig ? . tzdef { hasChanges = true }
2024-04-08 11:41:54 -07:00
}
2024-10-06 08:50:12 -07:00
. onChange ( of : ledHeartbeatEnabled ) { oldLedHeartbeatEnabled , newLedHeartbeatEnabled in
if oldLedHeartbeatEnabled != newLedHeartbeatEnabled && newLedHeartbeatEnabled != node ? . deviceConfig ? . ledHeartbeatEnabled ? ? false { hasChanges = true }
2024-08-08 12:16:14 -07:00
}
2022-06-13 20:43:51 -07:00
}
2023-03-19 18:37:23 -07:00
func setDeviceValues ( ) {
2025-05-08 11:29:18 -07:00
if node ? . deviceConfig ? . role ? ? 0 = = 3 {
node ? . deviceConfig ? . role = 1
}
2023-03-19 18:37:23 -07:00
self . deviceRole = Int ( node ? . deviceConfig ? . role ? ? 0 )
self . buttonGPIO = Int ( node ? . deviceConfig ? . buttonGpio ? ? 0 )
self . buzzerGPIO = Int ( node ? . deviceConfig ? . buzzerGpio ? ? 0 )
2023-04-01 15:01:11 -07:00
self . rebroadcastMode = Int ( node ? . deviceConfig ? . rebroadcastMode ? ? 0 )
2025-10-05 17:51:18 -07:00
self . nodeInfoBroadcastSecs = UpdateInterval ( from : Int ( node ? . deviceConfig ? . nodeInfoBroadcastSecs ? ? 10800 ) )
if nodeInfoBroadcastSecs . intValue < 10800 {
nodeInfoBroadcastSecs = UpdateInterval ( from : 10800 )
2024-03-17 09:07:11 -07:00
}
2023-05-01 10:39:49 -07:00
self . doubleTapAsButtonPress = node ? . deviceConfig ? . doubleTapAsButtonPress ? ? false
2024-10-05 13:52:38 -07:00
self . tripleClickAsAdHocPing = node ? . deviceConfig ? . tripleClickAsAdHocPing ? ? false
2024-04-26 18:06:23 -07:00
self . ledHeartbeatEnabled = node ? . deviceConfig ? . ledHeartbeatEnabled ? ? true
2024-05-04 13:02:47 -07:00
self . tzdef = node ? . deviceConfig ? . tzdef ? ? " "
2025-07-16 23:12:47 -07:00
hasChanges = false
2023-03-19 18:37:23 -07:00
}
2025-12-11 00:27:44 -05:00
private func specialRoleWarningMessage ( newRole : Int ) -> String {
if [ DeviceRoles . router . rawValue , DeviceRoles . routerLate . rawValue ] . contains ( newRole ) {
return " The Router roles are only for high vantage locations like mountaintops and towers with few nearby nodes, not for use in urban areas. Improper use will hurt your local mesh. "
} else if newRole = = DeviceRoles . clientBase . rawValue {
return " Switching to Client Base will clear this node's favorites. Client Base should only favorite other nodes you control. Improper use will hurt your local mesh. "
} else {
return " "
}
}
2022-06-13 20:43:51 -07:00
}