Meshtastic-Apple/MeshtasticProtobufs/Sources/meshtastic/module_config.pb.swift
Garth Vander Houwen d9e169142e
2.7.8 Working Changes (#1589)
* Bump version

* Stop and resume DD Session Replay on app backgrounding and activation to prevent crashes

* TAK server -> TestFlight  (#1567)

* Bump version

* Message list performance fixes into 2.7.6 (#1475)

* Remove extra want config call when adding a contact

* App badge and unnecessary notification fixes (#1455)

* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open

* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message

* Fix: Channels help grammer fix (#1452)

* remove outdated TCP not available on Apple devices (#1450)

* Update initial onboarding view

* remove toggle gating for mac

* Update crash reporting opt out in real time

* Update onboarding text

* Use mDNS text records for node name

* TCP IP and port on the connection screen

* Hide app icon chooser on mac

* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)

* 2.7.5 Working Changes (#1460)

* Remove extra want config call when adding a contact

* App badge and unnecessary notification fixes (#1455)

* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open

* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message

* Fix: Channels help grammer fix (#1452)

* remove outdated TCP not available on Apple devices (#1450)

* Update initial onboarding view

* remove toggle gating for mac

* Update crash reporting opt out in real time

* Update onboarding text

---------

Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>

* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise

* UserList: replace 5 slow calls to user.messageList with new fast calls

* NodeList: always put the connected node at the top of list (if it matches the node filters)

* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)

* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls

* Fix incorrect appState.unreadDirectMessages calculations

* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages

* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages

* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension

* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)

* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count

* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild

* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity

* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification

* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear

* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active

---------

Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>

* message-list-performance: revert scrolling changes (#1472)

* Revert e0f0b4a0f7 (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)

* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"

This reverts commit ee1a7c4415.

---------

Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>

* Explicitly set unmessagable, seems unnessary

* Add back missing mesh map features

* Fix: "Retrieving nodes" significantly slower after reconnect  extracted from #1424 (#1477)

* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)

The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.

Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
  and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially

Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
  (when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save

Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently

Fixes #1424

* Revert *MessageListUnified files

---------

Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Hide route lines filter from mesh map

* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)

Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>

* Fix bad merge

* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Keep list of previous manual connections (#1484)

* Keep list of previous manual connections

* More descriptive manual connection rows

* Merge fixes and new way to show IP on Connect view

---------

Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Show who relayed messages (#1486)

* Add identification for node that relayed text messages and add count for ammount of relayers of your message

* Ack Relays

* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)

* R1 NEO

* Neo

* Update Meshtastic/Views/Settings/AppSettings.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove bad if

* Git rid of extra environment variable

* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* MeshMap performance: quick wins (#1490)

* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame

* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function

* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)

* NodeMap performance improvements for high # positions history (#1480)

* NodeMapContent: move Route Lines out of ForEach

* NodeMapContent: move Convex Hull out of ForEach

* NodeMapContent: Replace `position.nodePosition?` with `node`

* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory

* NodeMapContent: hoist out nodeColorSwift

* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively

* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation

* NodeMapContent: remove unused @State

* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops

* NodeMapSwiftUI: disable animation during SwiftUI transactions

* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views

* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations

* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull

* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)

* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)

* Fix interval drop down formatter

* Clean up channel qr code functionality.

* perferredPeripheralId fix

* Set opt in

* Retry once 5 second timer. dont throw the error

* Queue for peripherals

* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)

* fix hops setting in dms

* Fix hops for exchange position

* Final fix

* Don't favorite client base

* Update device hardware

* Prevent nil environment metrics

* Bump datadog sdk

* fix setting device telemetry enabled (#1515)

* Update Muzi R1 Neo to actively supported

* fix setting device telemetry enabled

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Don't subscribe to mqtt topic if downlink is not on (#1501)

* Dont sub if no downlink

* moved reload mqtt connect config

* Preview enabled in connected devices (#1509)

* Update Muzi R1 Neo to actively supported

* Preview enabled in connected devices

* Fixing indentation

* Fixing indentation

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)

* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)

* FavoriteNodeButton: refactor task out

* AccessoryManager.connectedDeviceRole helper

* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite

* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495

* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER

* Adjust device configuration Client Base warning text

* Compass view (#1521)

* Added compass view

* Added Compass View

* Node colors in compass

* Update Muzi R1 Neo to actively supported

* Update PositionPopover.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Helpers/CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Helpers/CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove discovery queue

* revert problematic retry functionalliy

* format file

* Update & improve zh-Hans translation (#1523)

* Update Muzi R1 Neo to actively supported

* update & improve zh-Hans translation

rt

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Update protobufs to 2.7.1

* Add long-turbo preset

* Disable Range Test module when primary channel is public/unsecured (#1512)

* Update Muzi R1 Neo to actively supported

* Disable Range Test module when primary channel is public/unsecured

Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.

Disabled Range Test UI controls when on a public/default channel to prevent user interaction.

Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.

Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).

Matches the behavior implemented in the Android client for consistent policy across platforms.

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Add new device images

* Remove print statement, get rid of cut and paste error

* Bump version

* update the translations (#1540)

update the translations

* Don't alert (with sound: .default) when updating Live Activity (#1536)

* Fix adding channels (#1532)

* Full translation into Spanish (#1529)

* tapback with any emoji (#1538)

* Call clearStaleNodes at start of sendWantConfig (#1535)

* NFC Tag contact (#1537)

* Accessorymanager background discovery (#1542)

* Don't add new BLE  devices to the device list in the backgournd

* Bump version

* Update Meshtastic/MeshtasticApp.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/MeshtasticApp.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Revert "Full translation into Spanish (#1529)" (#1543)

This reverts commit f25fdfb89f.

* Revert "update the translations (#1540)" (#1544)

This reverts commit cb2fd8cc15.

* Revert "NFC Tag contact (#1537)" (#1545)

This reverts commit 5c22b8b6e0.

* Update Muzi R1 Neo to actively supported

* Revert "Update Muzi R1 Neo to actively supported"

* 2.7.6 Working Changes (#1479)

* Bump version

* Message list performance fixes into 2.7.6 (#1475)

* Remove extra want config call when adding a contact

* App badge and unnecessary notification fixes (#1455)

* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open

* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message

* Fix: Channels help grammer fix (#1452)

* remove outdated TCP not available on Apple devices (#1450)

* Update initial onboarding view

* remove toggle gating for mac

* Update crash reporting opt out in real time

* Update onboarding text

* Use mDNS text records for node name

* TCP IP and port on the connection screen

* Hide app icon chooser on mac

* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)

* 2.7.5 Working Changes (#1460)

* Remove extra want config call when adding a contact

* App badge and unnecessary notification fixes (#1455)

* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open

* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message

* Fix: Channels help grammer fix (#1452)

* remove outdated TCP not available on Apple devices (#1450)

* Update initial onboarding view

* remove toggle gating for mac

* Update crash reporting opt out in real time

* Update onboarding text

---------

Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>

* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise

* UserList: replace 5 slow calls to user.messageList with new fast calls

* NodeList: always put the connected node at the top of list (if it matches the node filters)

* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)

* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls

* Fix incorrect appState.unreadDirectMessages calculations

* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages

* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages

* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension

* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)

* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count

* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild

* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity

* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification

* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear

* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active

---------

Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>

* message-list-performance: revert scrolling changes (#1472)

* Revert e0f0b4a0f7 (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)

* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"

This reverts commit ee1a7c4415.

---------

Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>

* Explicitly set unmessagable, seems unnessary

* Add back missing mesh map features

* Fix: "Retrieving nodes" significantly slower after reconnect  extracted from #1424 (#1477)

* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)

The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.

Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
  and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially

Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
  (when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save

Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently

Fixes #1424

* Revert *MessageListUnified files

---------

Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Hide route lines filter from mesh map

* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)

Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>

* Fix bad merge

* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Keep list of previous manual connections (#1484)

* Keep list of previous manual connections

* More descriptive manual connection rows

* Merge fixes and new way to show IP on Connect view

---------

Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Show who relayed messages (#1486)

* Add identification for node that relayed text messages and add count for ammount of relayers of your message

* Ack Relays

* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)

* R1 NEO

* Neo

* Update Meshtastic/Views/Settings/AppSettings.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove bad if

* Git rid of extra environment variable

* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* MeshMap performance: quick wins (#1490)

* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame

* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function

* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)

* NodeMap performance improvements for high # positions history (#1480)

* NodeMapContent: move Route Lines out of ForEach

* NodeMapContent: move Convex Hull out of ForEach

* NodeMapContent: Replace `position.nodePosition?` with `node`

* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory

* NodeMapContent: hoist out nodeColorSwift

* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively

* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation

* NodeMapContent: remove unused @State

* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops

* NodeMapSwiftUI: disable animation during SwiftUI transactions

* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views

* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations

* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull

* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)

* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)

* Fix interval drop down formatter

* Clean up channel qr code functionality.

* perferredPeripheralId fix

* Set opt in

* Retry once 5 second timer. dont throw the error

* Queue for peripherals

* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)

* fix hops setting in dms

* Fix hops for exchange position

* Final fix

* Don't favorite client base

* Update device hardware

* Prevent nil environment metrics

* Bump datadog sdk

* fix setting device telemetry enabled (#1515)

* Update Muzi R1 Neo to actively supported

* fix setting device telemetry enabled

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Don't subscribe to mqtt topic if downlink is not on (#1501)

* Dont sub if no downlink

* moved reload mqtt connect config

* Preview enabled in connected devices (#1509)

* Update Muzi R1 Neo to actively supported

* Preview enabled in connected devices

* Fixing indentation

* Fixing indentation

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)

* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)

* FavoriteNodeButton: refactor task out

* AccessoryManager.connectedDeviceRole helper

* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite

* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495

* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER

* Adjust device configuration Client Base warning text

* Compass view (#1521)

* Added compass view

* Added Compass View

* Node colors in compass

* Update Muzi R1 Neo to actively supported

* Update PositionPopover.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Helpers/CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Views/Helpers/CompassView.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove discovery queue

* revert problematic retry functionalliy

* format file

* Update & improve zh-Hans translation (#1523)

* Update Muzi R1 Neo to actively supported

* update & improve zh-Hans translation

rt

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Update protobufs to 2.7.1

* Add long-turbo preset

* Disable Range Test module when primary channel is public/unsecured (#1512)

* Update Muzi R1 Neo to actively supported

* Disable Range Test module when primary channel is public/unsecured

Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.

Disabled Range Test UI controls when on a public/default channel to prevent user interaction.

Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.

Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).

Matches the behavior implemented in the Android client for consistent policy across platforms.

---------

Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>

* Add new device images

* Remove print statement, get rid of cut and paste error

---------

Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>

* Initial TAK Server implementation for IOS based TAK clients

This is my initial implementation for a TAK Server running inside Meshtastic-Apple.

* Update marketing version to 2.7.7

* Update MessageText.swift

* Update Meshtastic/Helpers/TAK/CoTMessage.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Helpers/TAK/TAKCertificateManager.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Refactor TAKServerConfig file importer to conditionally allow p12 or pem types; update CoTMessage parsing method name for clarity; enhance mTLS logging in TAKServerManager.

---------

Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
Co-authored-by: MGJ <62177301+MGJ520@users.noreply.github.com>
Co-authored-by: Alvaro Samudio <alvarosamudio@protonmail.com>
Co-authored-by: Mathew Kamkar <578302+matkam@users.noreply.github.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>

* Fix

* Add localization strings

* CoreData Writes wrapped in an Actor (#1569)

* MeshPackets.swift into an actor and make async

* Move upserts in UpdateCoreData to the MeshPackets actor

* Update Meshtastic/Views/Settings/AppSettings.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Meshtastic/Persistence/UpdateCoreData.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Refactor channel packet sending to use async/await pattern

* Fix call

* `// swiftlint:disable` overrides for TAK

* Revert "Fix call"

This reverts commit 097ddbd43f.

* Move CoreData operations onto background actor

* Fix for discovery reconnect issues (#1574)

Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Remove specific TAK client references

Be TAK client neutral.

* Update TAKDataPackageGenerator.swift

Add client cert to datapackage generation for TAK clients who require it. (TAK Aware afaik)

* Ble improvements (#1583)

* Fix for discovery reconnect issues

* Allow disconnect earlier in the connection process

---------

Co-authored-by: Jake-B <jake-b@users.noreply.github.com>

* Update linker flag for ios 17 crash

* Update protobufs

* Ru/translation (#1571)

* Russian localization is 50%

* Russian localization is 100%

* fix Taiwan language
Co-authored-by: Sergei K <svk@svk.su>
Co-authored-by: Dmitriy Petrov <kenzot.fpv@gmail.com>

* Fix connectToPreferredDevice parameter type to resolve compilation error (#1590)

* Initial plan

* Fix connectToPreferredDevice signature to accept optional device parameter

Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>

* Fix TAK certificate security and storage consistency

  Address multiple certificate management issues identified in code review:

  - Fix server P12 storage/retrieval inconsistency: getActiveServerP12Data()
    now reads from Keychain instead of UserDefaults, matching where
    importServerIdentity() stores the data

  - Improve client P12 security: migrate storage from UserDefaults to
    Keychain to protect certificate data from unauthorized access and
    backups

  - Fix Keychain cleanup: clearCustomCertificateData() now properly
    deletes both server and client P12 data from Keychain during reset

  - Add force-unwrap safety: replace sec_identity_create() force-unwrap
    with guard statement to prevent crashes, throwing
    TAKServerError.tlsConfigurationFailed instead

  - Remove unused backup certificates: delete Resources/Certificates/backup/
    folder to reduce app bundle size and avoid confusion about which
    certificates are active

  All certificate data (both server and client P12 files and passwords)
  now consistently use Keychain storage for improved security and proper
  cleanup during resets.

* Update TAKDataPackageGenerator.swift

Fix TAKAware's data package ingestion error.

This was due to us generating a DP with certs in a cert subdirectory. However TAKAware's parser did not check subdirectories.

  3 areas changed in TAKDataPackageGenerator.swift:

  1. Removed certs/ subdirectory creation (old lines 50-52) — the pref file and certificates are now written directly to tempDir instead of certsDir
  2. Files written to tempDir instead of certsDir — the pref file (line 72), truststore (line 80), and client cert (line 89) all go to the package root
  3. Manifest zipEntry values flattened (lines 216-218) — changed from certs\filename to just filename

  Pref file cert/ paths left unchanged (lines 170, 172) — these are ATAK convention for the client's internal cert store path, not zip-relative paths. SwiftTAK strips them to just the filename
  anyway, and ATAK/iTAK interpret them the same way.

  The resulting zip structure will now be:
  Meshtastic_TAK_Server/
  ├── manifest.xml
  ├── meshtastic-server.pref
  ├── truststore.p12
  └── DeviceName.p12

  This matches the flat structure used by all passing SwiftTAK test packages (tak-all-top.zip, tak-subfolder-all-top.zip, etc.).

* Fix copilot identified issues

  #10 — manifest.xml: Removed certs\ prefix from zip entry paths so they match the actual flat file structure.

  #11 — taky-server.pref: Fixed cert/ path prefixes to match the flat structure, and replaced hardcoded atakatak passwords with YOURPASSWORD placeholders.

  #12 — TAKServerConfig.swift:41: Replaced force-unwraps (UTType(filenameExtension: "p12")!) with nil-coalescing fallbacks (?? .pkcs12 and ?? .plainText).

  #13 — TAKConnection.swift:26: Removed the unused bufferTrimSize constant.

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
Co-authored-by: MGJ <62177301+MGJ520@users.noreply.github.com>
Co-authored-by: Alvaro Samudio <alvarosamudio@protonmail.com>
Co-authored-by: Mathew Kamkar <578302+matkam@users.noreply.github.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Dmitriy Q <40627944+krotesk@users.noreply.github.com>
Co-authored-by: Sergei K <svk@svk.su>
Co-authored-by: Dmitriy Petrov <kenzot.fpv@gmail.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
2026-02-13 16:06:29 -08:00

2769 lines
108 KiB
Swift

// DO NOT EDIT.
// swift-format-ignore-file
// swiftlint:disable all
//
// Generated by the Swift generator plugin for the protocol buffer compiler.
// Source: meshtastic/module_config.proto
//
// For information on using the generated types, please see the documentation:
// https://github.com/apple/swift-protobuf/
import SwiftProtobuf
// If the compiler emits an error on this type, it is because this file
// was generated by a version of the `protoc` Swift plug-in that is
// incompatible with the version of SwiftProtobuf to which you are linking.
// Please ensure that you are building against the same version of the API
// that was used to generate this file.
fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck {
struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {}
typealias Version = _2
}
public enum RemoteHardwarePinType: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
///
/// Unset/unused
case unknown // = 0
///
/// GPIO pin can be read (if it is high / low)
case digitalRead // = 1
///
/// GPIO pin can be written to (high / low)
case digitalWrite // = 2
case UNRECOGNIZED(Int)
public init() {
self = .unknown
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .unknown
case 1: self = .digitalRead
case 2: self = .digitalWrite
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .unknown: return 0
case .digitalRead: return 1
case .digitalWrite: return 2
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [RemoteHardwarePinType] = [
.unknown,
.digitalRead,
.digitalWrite,
]
}
///
/// Module Config
public struct ModuleConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// TODO: REPLACE
public var payloadVariant: ModuleConfig.OneOf_PayloadVariant? = nil
///
/// TODO: REPLACE
public var mqtt: ModuleConfig.MQTTConfig {
get {
if case .mqtt(let v)? = payloadVariant {return v}
return ModuleConfig.MQTTConfig()
}
set {payloadVariant = .mqtt(newValue)}
}
///
/// TODO: REPLACE
public var serial: ModuleConfig.SerialConfig {
get {
if case .serial(let v)? = payloadVariant {return v}
return ModuleConfig.SerialConfig()
}
set {payloadVariant = .serial(newValue)}
}
///
/// TODO: REPLACE
public var externalNotification: ModuleConfig.ExternalNotificationConfig {
get {
if case .externalNotification(let v)? = payloadVariant {return v}
return ModuleConfig.ExternalNotificationConfig()
}
set {payloadVariant = .externalNotification(newValue)}
}
///
/// TODO: REPLACE
public var storeForward: ModuleConfig.StoreForwardConfig {
get {
if case .storeForward(let v)? = payloadVariant {return v}
return ModuleConfig.StoreForwardConfig()
}
set {payloadVariant = .storeForward(newValue)}
}
///
/// TODO: REPLACE
public var rangeTest: ModuleConfig.RangeTestConfig {
get {
if case .rangeTest(let v)? = payloadVariant {return v}
return ModuleConfig.RangeTestConfig()
}
set {payloadVariant = .rangeTest(newValue)}
}
///
/// TODO: REPLACE
public var telemetry: ModuleConfig.TelemetryConfig {
get {
if case .telemetry(let v)? = payloadVariant {return v}
return ModuleConfig.TelemetryConfig()
}
set {payloadVariant = .telemetry(newValue)}
}
///
/// TODO: REPLACE
public var cannedMessage: ModuleConfig.CannedMessageConfig {
get {
if case .cannedMessage(let v)? = payloadVariant {return v}
return ModuleConfig.CannedMessageConfig()
}
set {payloadVariant = .cannedMessage(newValue)}
}
///
/// TODO: REPLACE
public var audio: ModuleConfig.AudioConfig {
get {
if case .audio(let v)? = payloadVariant {return v}
return ModuleConfig.AudioConfig()
}
set {payloadVariant = .audio(newValue)}
}
///
/// TODO: REPLACE
public var remoteHardware: ModuleConfig.RemoteHardwareConfig {
get {
if case .remoteHardware(let v)? = payloadVariant {return v}
return ModuleConfig.RemoteHardwareConfig()
}
set {payloadVariant = .remoteHardware(newValue)}
}
///
/// TODO: REPLACE
public var neighborInfo: ModuleConfig.NeighborInfoConfig {
get {
if case .neighborInfo(let v)? = payloadVariant {return v}
return ModuleConfig.NeighborInfoConfig()
}
set {payloadVariant = .neighborInfo(newValue)}
}
///
/// TODO: REPLACE
public var ambientLighting: ModuleConfig.AmbientLightingConfig {
get {
if case .ambientLighting(let v)? = payloadVariant {return v}
return ModuleConfig.AmbientLightingConfig()
}
set {payloadVariant = .ambientLighting(newValue)}
}
///
/// TODO: REPLACE
public var detectionSensor: ModuleConfig.DetectionSensorConfig {
get {
if case .detectionSensor(let v)? = payloadVariant {return v}
return ModuleConfig.DetectionSensorConfig()
}
set {payloadVariant = .detectionSensor(newValue)}
}
///
/// TODO: REPLACE
public var paxcounter: ModuleConfig.PaxcounterConfig {
get {
if case .paxcounter(let v)? = payloadVariant {return v}
return ModuleConfig.PaxcounterConfig()
}
set {payloadVariant = .paxcounter(newValue)}
}
///
/// TODO: REPLACE
public var statusmessage: ModuleConfig.StatusMessageConfig {
get {
if case .statusmessage(let v)? = payloadVariant {return v}
return ModuleConfig.StatusMessageConfig()
}
set {payloadVariant = .statusmessage(newValue)}
}
///
/// Traffic management module config for mesh network optimization
public var trafficManagement: ModuleConfig.TrafficManagementConfig {
get {
if case .trafficManagement(let v)? = payloadVariant {return v}
return ModuleConfig.TrafficManagementConfig()
}
set {payloadVariant = .trafficManagement(newValue)}
}
public var unknownFields = SwiftProtobuf.UnknownStorage()
///
/// TODO: REPLACE
public enum OneOf_PayloadVariant: Equatable, Sendable {
///
/// TODO: REPLACE
case mqtt(ModuleConfig.MQTTConfig)
///
/// TODO: REPLACE
case serial(ModuleConfig.SerialConfig)
///
/// TODO: REPLACE
case externalNotification(ModuleConfig.ExternalNotificationConfig)
///
/// TODO: REPLACE
case storeForward(ModuleConfig.StoreForwardConfig)
///
/// TODO: REPLACE
case rangeTest(ModuleConfig.RangeTestConfig)
///
/// TODO: REPLACE
case telemetry(ModuleConfig.TelemetryConfig)
///
/// TODO: REPLACE
case cannedMessage(ModuleConfig.CannedMessageConfig)
///
/// TODO: REPLACE
case audio(ModuleConfig.AudioConfig)
///
/// TODO: REPLACE
case remoteHardware(ModuleConfig.RemoteHardwareConfig)
///
/// TODO: REPLACE
case neighborInfo(ModuleConfig.NeighborInfoConfig)
///
/// TODO: REPLACE
case ambientLighting(ModuleConfig.AmbientLightingConfig)
///
/// TODO: REPLACE
case detectionSensor(ModuleConfig.DetectionSensorConfig)
///
/// TODO: REPLACE
case paxcounter(ModuleConfig.PaxcounterConfig)
///
/// TODO: REPLACE
case statusmessage(ModuleConfig.StatusMessageConfig)
///
/// Traffic management module config for mesh network optimization
case trafficManagement(ModuleConfig.TrafficManagementConfig)
}
///
/// MQTT Client Config
public struct MQTTConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as
/// is_uplink_enabled or is_downlink_enabled.
public var enabled: Bool = false
///
/// The server to use for our MQTT global message gateway feature.
/// If not set, the default server will be used
public var address: String = String()
///
/// MQTT username to use (most useful for a custom MQTT server).
/// If using a custom server, this will be honoured even if empty.
/// If using the default server, this will only be honoured if set, otherwise the device will use the default username
public var username: String = String()
///
/// MQTT password to use (most useful for a custom MQTT server).
/// If using a custom server, this will be honoured even if empty.
/// If using the default server, this will only be honoured if set, otherwise the device will use the default password
public var password: String = String()
///
/// Whether to send encrypted or decrypted packets to MQTT.
/// This parameter is only honoured if you also set server
/// (the default official mqtt.meshtastic.org server can handle encrypted packets)
/// Decrypted packets may be useful for external systems that want to consume meshtastic packets
public var encryptionEnabled: Bool = false
///
/// Whether to send / consume json packets on MQTT
public var jsonEnabled: Bool = false
///
/// If true, we attempt to establish a secure connection using TLS
public var tlsEnabled: Bool = false
///
/// The root topic to use for MQTT messages. Default is "msh".
/// This is useful if you want to use a single MQTT server for multiple meshtastic networks and separate them via ACLs
public var root: String = String()
///
/// If true, we can use the connected phone / client to proxy messages to MQTT instead of a direct connection
public var proxyToClientEnabled: Bool = false
///
/// If true, we will periodically report unencrypted information about our node to a map via MQTT
public var mapReportingEnabled: Bool = false
///
/// Settings for reporting information about our node to a map via MQTT
public var mapReportSettings: ModuleConfig.MapReportSettings {
get {return _mapReportSettings ?? ModuleConfig.MapReportSettings()}
set {_mapReportSettings = newValue}
}
/// Returns true if `mapReportSettings` has been explicitly set.
public var hasMapReportSettings: Bool {return self._mapReportSettings != nil}
/// Clears the value of `mapReportSettings`. Subsequent reads from it will return its default value.
public mutating func clearMapReportSettings() {self._mapReportSettings = nil}
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
fileprivate var _mapReportSettings: ModuleConfig.MapReportSettings? = nil
}
///
/// Settings for reporting unencrypted information about our node to a map via MQTT
public struct MapReportSettings: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// How often we should report our info to the map (in seconds)
public var publishIntervalSecs: UInt32 = 0
///
/// Bits of precision for the location sent (default of 32 is full precision).
public var positionPrecision: UInt32 = 0
///
/// Whether we have opted-in to report our location to the map
public var shouldReportLocation: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// RemoteHardwareModule Config
public struct RemoteHardwareConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Whether the Module is enabled
public var enabled: Bool = false
///
/// Whether the Module allows consumers to read / write to pins not defined in available_pins
public var allowUndefinedPinAccess: Bool = false
///
/// Exposes the available pins to the mesh for reading and writing
public var availablePins: [RemoteHardwarePin] = []
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// NeighborInfoModule Config
public struct NeighborInfoConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Whether the Module is enabled
public var enabled: Bool = false
///
/// Interval in seconds of how often we should try to send our
/// Neighbor Info (minimum is 14400, i.e., 4 hours)
public var updateInterval: UInt32 = 0
///
/// Whether in addition to sending it to MQTT and the PhoneAPI, our NeighborInfo should be transmitted over LoRa.
/// Note that this is not available on a channel with default key and name.
public var transmitOverLora: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Detection Sensor Module Config
public struct DetectionSensorConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Whether the Module is enabled
public var enabled: Bool = false
///
/// Interval in seconds of how often we can send a message to the mesh when a
/// trigger event is detected
public var minimumBroadcastSecs: UInt32 = 0
///
/// Interval in seconds of how often we should send a message to the mesh
/// with the current state regardless of trigger events When set to 0, only
/// trigger events will be broadcasted Works as a sort of status heartbeat
/// for peace of mind
public var stateBroadcastSecs: UInt32 = 0
///
/// Send ASCII bell with alert message
/// Useful for triggering ext. notification on bell
public var sendBell: Bool = false
///
/// Friendly name used to format message sent to mesh
/// Example: A name "Motion" would result in a message "Motion detected"
/// Maximum length of 20 characters
public var name: String = String()
///
/// GPIO pin to monitor for state changes
public var monitorPin: UInt32 = 0
///
/// The type of trigger event to be used
public var detectionTriggerType: ModuleConfig.DetectionSensorConfig.TriggerType = .logicLow
///
/// Whether or not use INPUT_PULLUP mode for GPIO pin
/// Only applicable if the board uses pull-up resistors on the pin
public var usePullup: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public enum TriggerType: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
/// Event is triggered if pin is low
case logicLow // = 0
/// Event is triggered if pin is high
case logicHigh // = 1
/// Event is triggered when pin goes high to low
case fallingEdge // = 2
/// Event is triggered when pin goes low to high
case risingEdge // = 3
/// Event is triggered on every pin state change, low is considered to be
/// "active"
case eitherEdgeActiveLow // = 4
/// Event is triggered on every pin state change, high is considered to be
/// "active"
case eitherEdgeActiveHigh // = 5
case UNRECOGNIZED(Int)
public init() {
self = .logicLow
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .logicLow
case 1: self = .logicHigh
case 2: self = .fallingEdge
case 3: self = .risingEdge
case 4: self = .eitherEdgeActiveLow
case 5: self = .eitherEdgeActiveHigh
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .logicLow: return 0
case .logicHigh: return 1
case .fallingEdge: return 2
case .risingEdge: return 3
case .eitherEdgeActiveLow: return 4
case .eitherEdgeActiveHigh: return 5
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [ModuleConfig.DetectionSensorConfig.TriggerType] = [
.logicLow,
.logicHigh,
.fallingEdge,
.risingEdge,
.eitherEdgeActiveLow,
.eitherEdgeActiveHigh,
]
}
public init() {}
}
///
/// Audio Config for codec2 voice
public struct AudioConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Whether Audio is enabled
public var codec2Enabled: Bool = false
///
/// PTT Pin
public var pttPin: UInt32 = 0
///
/// The audio sample rate to use for codec2
public var bitrate: ModuleConfig.AudioConfig.Audio_Baud = .codec2Default
///
/// I2S Word Select
public var i2SWs: UInt32 = 0
///
/// I2S Data IN
public var i2SSd: UInt32 = 0
///
/// I2S Data OUT
public var i2SDin: UInt32 = 0
///
/// I2S Clock
public var i2SSck: UInt32 = 0
public var unknownFields = SwiftProtobuf.UnknownStorage()
///
/// Baudrate for codec2 voice
public enum Audio_Baud: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
case codec2Default // = 0
case codec23200 // = 1
case codec22400 // = 2
case codec21600 // = 3
case codec21400 // = 4
case codec21300 // = 5
case codec21200 // = 6
case codec2700 // = 7
case codec2700B // = 8
case UNRECOGNIZED(Int)
public init() {
self = .codec2Default
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .codec2Default
case 1: self = .codec23200
case 2: self = .codec22400
case 3: self = .codec21600
case 4: self = .codec21400
case 5: self = .codec21300
case 6: self = .codec21200
case 7: self = .codec2700
case 8: self = .codec2700B
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .codec2Default: return 0
case .codec23200: return 1
case .codec22400: return 2
case .codec21600: return 3
case .codec21400: return 4
case .codec21300: return 5
case .codec21200: return 6
case .codec2700: return 7
case .codec2700B: return 8
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [ModuleConfig.AudioConfig.Audio_Baud] = [
.codec2Default,
.codec23200,
.codec22400,
.codec21600,
.codec21400,
.codec21300,
.codec21200,
.codec2700,
.codec2700B,
]
}
public init() {}
}
///
/// Config for the Paxcounter Module
public struct PaxcounterConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Enable the Paxcounter Module
public var enabled: Bool = false
public var paxcounterUpdateInterval: UInt32 = 0
///
/// WiFi RSSI threshold. Defaults to -80
public var wifiThreshold: Int32 = 0
///
/// BLE RSSI threshold. Defaults to -80
public var bleThreshold: Int32 = 0
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Config for the Traffic Management module.
/// Provides packet inspection and traffic shaping to help reduce channel utilization
public struct TrafficManagementConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Master enable for traffic management module
public var enabled: Bool = false
///
/// Enable position deduplication to drop redundant position broadcasts
public var positionDedupEnabled: Bool = false
///
/// Number of bits of precision for position deduplication (0-32)
public var positionPrecisionBits: UInt32 = 0
///
/// Minimum interval in seconds between position updates from the same node
public var positionMinIntervalSecs: UInt32 = 0
///
/// Enable direct response to NodeInfo requests from local cache
public var nodeinfoDirectResponse: Bool = false
///
/// Minimum hop distance from requestor before responding to NodeInfo requests
public var nodeinfoDirectResponseMaxHops: UInt32 = 0
///
/// Enable per-node rate limiting to throttle chatty nodes
public var rateLimitEnabled: Bool = false
///
/// Time window in seconds for rate limiting calculations
public var rateLimitWindowSecs: UInt32 = 0
///
/// Maximum packets allowed per node within the rate limit window
public var rateLimitMaxPackets: UInt32 = 0
///
/// Enable dropping of unknown/undecryptable packets per rate_limit_window_secs
public var dropUnknownEnabled: Bool = false
///
/// Number of unknown packets before dropping from a node
public var unknownPacketThreshold: UInt32 = 0
///
/// Set hop_limit to 0 for relayed telemetry broadcasts (own packets unaffected)
public var exhaustHopTelemetry: Bool = false
///
/// Set hop_limit to 0 for relayed position broadcasts (own packets unaffected)
public var exhaustHopPosition: Bool = false
///
/// Preserve hop_limit for router-to-router traffic
public var routerPreserveHops: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Serial Config
public struct SerialConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Preferences for the SerialModule
public var enabled: Bool = false
///
/// TODO: REPLACE
public var echo: Bool = false
///
/// RX pin (should match Arduino gpio pin number)
public var rxd: UInt32 = 0
///
/// TX pin (should match Arduino gpio pin number)
public var txd: UInt32 = 0
///
/// Serial baud rate
public var baud: ModuleConfig.SerialConfig.Serial_Baud = .baudDefault
///
/// TODO: REPLACE
public var timeout: UInt32 = 0
///
/// Mode for serial module operation
public var mode: ModuleConfig.SerialConfig.Serial_Mode = .default
///
/// Overrides the platform's defacto Serial port instance to use with Serial module config settings
/// This is currently only usable in output modes like NMEA / CalTopo and may behave strangely or not work at all in other modes
/// Existing logging over the Serial Console will still be present
public var overrideConsoleSerialPort: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
///
/// TODO: REPLACE
public enum Serial_Baud: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
case baudDefault // = 0
case baud110 // = 1
case baud300 // = 2
case baud600 // = 3
case baud1200 // = 4
case baud2400 // = 5
case baud4800 // = 6
case baud9600 // = 7
case baud19200 // = 8
case baud38400 // = 9
case baud57600 // = 10
case baud115200 // = 11
case baud230400 // = 12
case baud460800 // = 13
case baud576000 // = 14
case baud921600 // = 15
case UNRECOGNIZED(Int)
public init() {
self = .baudDefault
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .baudDefault
case 1: self = .baud110
case 2: self = .baud300
case 3: self = .baud600
case 4: self = .baud1200
case 5: self = .baud2400
case 6: self = .baud4800
case 7: self = .baud9600
case 8: self = .baud19200
case 9: self = .baud38400
case 10: self = .baud57600
case 11: self = .baud115200
case 12: self = .baud230400
case 13: self = .baud460800
case 14: self = .baud576000
case 15: self = .baud921600
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .baudDefault: return 0
case .baud110: return 1
case .baud300: return 2
case .baud600: return 3
case .baud1200: return 4
case .baud2400: return 5
case .baud4800: return 6
case .baud9600: return 7
case .baud19200: return 8
case .baud38400: return 9
case .baud57600: return 10
case .baud115200: return 11
case .baud230400: return 12
case .baud460800: return 13
case .baud576000: return 14
case .baud921600: return 15
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [ModuleConfig.SerialConfig.Serial_Baud] = [
.baudDefault,
.baud110,
.baud300,
.baud600,
.baud1200,
.baud2400,
.baud4800,
.baud9600,
.baud19200,
.baud38400,
.baud57600,
.baud115200,
.baud230400,
.baud460800,
.baud576000,
.baud921600,
]
}
///
/// TODO: REPLACE
public enum Serial_Mode: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
case `default` // = 0
case simple // = 1
case proto // = 2
case textmsg // = 3
case nmea // = 4
/// NMEA messages specifically tailored for CalTopo
case caltopo // = 5
/// Ecowitt WS85 weather station
case ws85 // = 6
/// VE.Direct is a serial protocol used by Victron Energy products
/// https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable
case veDirect // = 7
/// Used to configure and view some parameters of MeshSolar.
/// https://heltec.org/project/meshsolar/
case msConfig // = 8
/// Logs mesh traffic to the serial pins, ideal for logging via openLog or similar.
case log // = 9
/// only text (channel & DM)
case logtext // = 10
case UNRECOGNIZED(Int)
public init() {
self = .default
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .default
case 1: self = .simple
case 2: self = .proto
case 3: self = .textmsg
case 4: self = .nmea
case 5: self = .caltopo
case 6: self = .ws85
case 7: self = .veDirect
case 8: self = .msConfig
case 9: self = .log
case 10: self = .logtext
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .default: return 0
case .simple: return 1
case .proto: return 2
case .textmsg: return 3
case .nmea: return 4
case .caltopo: return 5
case .ws85: return 6
case .veDirect: return 7
case .msConfig: return 8
case .log: return 9
case .logtext: return 10
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [ModuleConfig.SerialConfig.Serial_Mode] = [
.default,
.simple,
.proto,
.textmsg,
.nmea,
.caltopo,
.ws85,
.veDirect,
.msConfig,
.log,
.logtext,
]
}
public init() {}
}
///
/// External Notifications Config
public struct ExternalNotificationConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Enable the ExternalNotificationModule
public var enabled: Bool = false
///
/// When using in On/Off mode, keep the output on for this many
/// milliseconds. Default 1000ms (1 second).
public var outputMs: UInt32 = 0
///
/// Define the output pin GPIO setting Defaults to
/// EXT_NOTIFY_OUT if set for the board.
/// In standalone devices this pin should drive the LED to match the UI.
public var output: UInt32 = 0
///
/// Optional: Define a secondary output pin for a vibra motor
/// This is used in standalone devices to match the UI.
public var outputVibra: UInt32 = 0
///
/// Optional: Define a tertiary output pin for an active buzzer
/// This is used in standalone devices to to match the UI.
public var outputBuzzer: UInt32 = 0
///
/// IF this is true, the 'output' Pin will be pulled active high, false
/// means active low.
public var active: Bool = false
///
/// True: Alert when a text message arrives (output)
public var alertMessage: Bool = false
///
/// True: Alert when a text message arrives (output_vibra)
public var alertMessageVibra: Bool = false
///
/// True: Alert when a text message arrives (output_buzzer)
public var alertMessageBuzzer: Bool = false
///
/// True: Alert when the bell character is received (output)
public var alertBell: Bool = false
///
/// True: Alert when the bell character is received (output_vibra)
public var alertBellVibra: Bool = false
///
/// True: Alert when the bell character is received (output_buzzer)
public var alertBellBuzzer: Bool = false
///
/// use a PWM output instead of a simple on/off output. This will ignore
/// the 'output', 'output_ms' and 'active' settings and use the
/// device.buzzer_gpio instead.
public var usePwm: Bool = false
///
/// The notification will toggle with 'output_ms' for this time of seconds.
/// Default is 0 which means don't repeat at all. 60 would mean blink
/// and/or beep for 60 seconds
public var nagTimeout: UInt32 = 0
///
/// When true, enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer
/// T-Watch S3 and T-Deck for example have this capability
public var useI2SAsBuzzer: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Store and Forward Module Config
public struct StoreForwardConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Enable the Store and Forward Module
public var enabled: Bool = false
///
/// TODO: REPLACE
public var heartbeat: Bool = false
///
/// TODO: REPLACE
public var records: UInt32 = 0
///
/// TODO: REPLACE
public var historyReturnMax: UInt32 = 0
///
/// TODO: REPLACE
public var historyReturnWindow: UInt32 = 0
///
/// Set to true to let this node act as a server that stores received messages and resends them upon request.
public var isServer: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Preferences for the RangeTestModule
public struct RangeTestConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Enable the Range Test Module
public var enabled: Bool = false
///
/// Send out range test messages from this node
public var sender: UInt32 = 0
///
/// Bool value indicating that this node should save a RangeTest.csv file.
/// ESP32 Only
public var save: Bool = false
///
/// Bool indicating that the node should cleanup / destroy it's RangeTest.csv file.
/// ESP32 Only
public var clearOnReboot_p: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Configuration for both device and environment metrics
public struct TelemetryConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Interval in seconds of how often we should try to send our
/// device metrics to the mesh
public var deviceUpdateInterval: UInt32 = 0
public var environmentUpdateInterval: UInt32 = 0
///
/// Preferences for the Telemetry Module (Environment)
/// Enable/Disable the telemetry measurement module measurement collection
public var environmentMeasurementEnabled: Bool = false
///
/// Enable/Disable the telemetry measurement module on-device display
public var environmentScreenEnabled: Bool = false
///
/// We'll always read the sensor in Celsius, but sometimes we might want to
/// display the results in Fahrenheit as a "user preference".
public var environmentDisplayFahrenheit: Bool = false
///
/// Enable/Disable the air quality metrics
public var airQualityEnabled: Bool = false
///
/// Interval in seconds of how often we should try to send our
/// air quality metrics to the mesh
public var airQualityInterval: UInt32 = 0
///
/// Enable/disable Power metrics
public var powerMeasurementEnabled: Bool = false
///
/// Interval in seconds of how often we should try to send our
/// power metrics to the mesh
public var powerUpdateInterval: UInt32 = 0
///
/// Enable/Disable the power measurement module on-device display
public var powerScreenEnabled: Bool = false
///
/// Preferences for the (Health) Telemetry Module
/// Enable/Disable the telemetry measurement module measurement collection
public var healthMeasurementEnabled: Bool = false
///
/// Interval in seconds of how often we should try to send our
/// health metrics to the mesh
public var healthUpdateInterval: UInt32 = 0
///
/// Enable/Disable the health telemetry module on-device display
public var healthScreenEnabled: Bool = false
///
/// Enable/Disable the device telemetry module to send metrics to the mesh
/// Note: We will still send telemtry to the connected phone / client every minute over the API
public var deviceTelemetryEnabled: Bool = false
///
/// Enable/Disable the air quality telemetry measurement module on-device display
public var airQualityScreenEnabled: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// Canned Messages Module Config
public struct CannedMessageConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating.
public var rotary1Enabled: Bool = false
///
/// GPIO pin for rotary encoder A port.
public var inputbrokerPinA: UInt32 = 0
///
/// GPIO pin for rotary encoder B port.
public var inputbrokerPinB: UInt32 = 0
///
/// GPIO pin for rotary encoder Press port.
public var inputbrokerPinPress: UInt32 = 0
///
/// Generate input event on CW of this kind.
public var inputbrokerEventCw: ModuleConfig.CannedMessageConfig.InputEventChar = .none
///
/// Generate input event on CCW of this kind.
public var inputbrokerEventCcw: ModuleConfig.CannedMessageConfig.InputEventChar = .none
///
/// Generate input event on Press of this kind.
public var inputbrokerEventPress: ModuleConfig.CannedMessageConfig.InputEventChar = .none
///
/// Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker.
public var updown1Enabled: Bool = false
///
/// Enable/disable CannedMessageModule.
///
/// NOTE: This field was marked as deprecated in the .proto file.
public var enabled: Bool = false
///
/// Input event origin accepted by the canned message module.
/// Can be e.g. "rotEnc1", "upDownEnc1", "scanAndSelect", "cardkb", "serialkb", or keyword "_any"
///
/// NOTE: This field was marked as deprecated in the .proto file.
public var allowInputSource: String = String()
///
/// CannedMessageModule also sends a bell character with the messages.
/// ExternalNotificationModule can benefit from this feature.
public var sendBell: Bool = false
public var unknownFields = SwiftProtobuf.UnknownStorage()
///
/// TODO: REPLACE
public enum InputEventChar: SwiftProtobuf.Enum, Swift.CaseIterable {
public typealias RawValue = Int
///
/// TODO: REPLACE
case none // = 0
///
/// TODO: REPLACE
case up // = 17
///
/// TODO: REPLACE
case down // = 18
///
/// TODO: REPLACE
case left // = 19
///
/// TODO: REPLACE
case right // = 20
///
/// '\n'
case select // = 10
///
/// TODO: REPLACE
case back // = 27
///
/// TODO: REPLACE
case cancel // = 24
case UNRECOGNIZED(Int)
public init() {
self = .none
}
public init?(rawValue: Int) {
switch rawValue {
case 0: self = .none
case 10: self = .select
case 17: self = .up
case 18: self = .down
case 19: self = .left
case 20: self = .right
case 24: self = .cancel
case 27: self = .back
default: self = .UNRECOGNIZED(rawValue)
}
}
public var rawValue: Int {
switch self {
case .none: return 0
case .select: return 10
case .up: return 17
case .down: return 18
case .left: return 19
case .right: return 20
case .cancel: return 24
case .back: return 27
case .UNRECOGNIZED(let i): return i
}
}
// The compiler won't synthesize support with the UNRECOGNIZED case.
public static let allCases: [ModuleConfig.CannedMessageConfig.InputEventChar] = [
.none,
.up,
.down,
.left,
.right,
.select,
.back,
.cancel,
]
}
public init() {}
}
///
///Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels.
///Initially created for the RAK14001 RGB LED module.
public struct AmbientLightingConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// Sets LED to on or off.
public var ledState: Bool = false
///
/// Sets the current for the LED output. Default is 10.
public var current: UInt32 = 0
///
/// Sets the red LED level. Values are 0-255.
public var red: UInt32 = 0
///
/// Sets the green LED level. Values are 0-255.
public var green: UInt32 = 0
///
/// Sets the blue LED level. Values are 0-255.
public var blue: UInt32 = 0
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
///
/// StatusMessage config - Allows setting a status message for a node to periodically rebroadcast
public struct StatusMessageConfig: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// The actual status string
public var nodeStatus: String = String()
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
public init() {}
}
///
/// A GPIO pin definition for remote hardware module
public struct RemoteHardwarePin: Sendable {
// SwiftProtobuf.Message conformance is added in an extension below. See the
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages.
///
/// GPIO Pin number (must match Arduino)
public var gpioPin: UInt32 = 0
///
/// Name for the GPIO pin (i.e. Front gate, mailbox, etc)
public var name: String = String()
///
/// Type of GPIO access available to consumers on the mesh
public var type: RemoteHardwarePinType = .unknown
public var unknownFields = SwiftProtobuf.UnknownStorage()
public init() {}
}
// MARK: - Code below here is support for the SwiftProtobuf runtime.
fileprivate let _protobuf_package = "meshtastic"
extension RemoteHardwarePinType: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0UNKNOWN\0\u{1}DIGITAL_READ\0\u{1}DIGITAL_WRITE\0")
}
extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = _protobuf_package + ".ModuleConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}mqtt\0\u{1}serial\0\u{3}external_notification\0\u{3}store_forward\0\u{3}range_test\0\u{1}telemetry\0\u{3}canned_message\0\u{1}audio\0\u{3}remote_hardware\0\u{3}neighbor_info\0\u{3}ambient_lighting\0\u{3}detection_sensor\0\u{1}paxcounter\0\u{1}statusmessage\0\u{3}traffic_management\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try {
var v: ModuleConfig.MQTTConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .mqtt(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .mqtt(v)
}
}()
case 2: try {
var v: ModuleConfig.SerialConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .serial(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .serial(v)
}
}()
case 3: try {
var v: ModuleConfig.ExternalNotificationConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .externalNotification(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .externalNotification(v)
}
}()
case 4: try {
var v: ModuleConfig.StoreForwardConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .storeForward(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .storeForward(v)
}
}()
case 5: try {
var v: ModuleConfig.RangeTestConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .rangeTest(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .rangeTest(v)
}
}()
case 6: try {
var v: ModuleConfig.TelemetryConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .telemetry(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .telemetry(v)
}
}()
case 7: try {
var v: ModuleConfig.CannedMessageConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .cannedMessage(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .cannedMessage(v)
}
}()
case 8: try {
var v: ModuleConfig.AudioConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .audio(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .audio(v)
}
}()
case 9: try {
var v: ModuleConfig.RemoteHardwareConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .remoteHardware(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .remoteHardware(v)
}
}()
case 10: try {
var v: ModuleConfig.NeighborInfoConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .neighborInfo(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .neighborInfo(v)
}
}()
case 11: try {
var v: ModuleConfig.AmbientLightingConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .ambientLighting(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .ambientLighting(v)
}
}()
case 12: try {
var v: ModuleConfig.DetectionSensorConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .detectionSensor(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .detectionSensor(v)
}
}()
case 13: try {
var v: ModuleConfig.PaxcounterConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .paxcounter(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .paxcounter(v)
}
}()
case 14: try {
var v: ModuleConfig.StatusMessageConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .statusmessage(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .statusmessage(v)
}
}()
case 15: try {
var v: ModuleConfig.TrafficManagementConfig?
var hadOneofValue = false
if let current = self.payloadVariant {
hadOneofValue = true
if case .trafficManagement(let m) = current {v = m}
}
try decoder.decodeSingularMessageField(value: &v)
if let v = v {
if hadOneofValue {try decoder.handleConflictingOneOf()}
self.payloadVariant = .trafficManagement(v)
}
}()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every if/case branch local when no optimizations
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
// https://github.com/apple/swift-protobuf/issues/1182
switch self.payloadVariant {
case .mqtt?: try {
guard case .mqtt(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 1)
}()
case .serial?: try {
guard case .serial(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 2)
}()
case .externalNotification?: try {
guard case .externalNotification(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 3)
}()
case .storeForward?: try {
guard case .storeForward(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 4)
}()
case .rangeTest?: try {
guard case .rangeTest(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 5)
}()
case .telemetry?: try {
guard case .telemetry(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 6)
}()
case .cannedMessage?: try {
guard case .cannedMessage(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 7)
}()
case .audio?: try {
guard case .audio(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 8)
}()
case .remoteHardware?: try {
guard case .remoteHardware(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 9)
}()
case .neighborInfo?: try {
guard case .neighborInfo(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 10)
}()
case .ambientLighting?: try {
guard case .ambientLighting(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 11)
}()
case .detectionSensor?: try {
guard case .detectionSensor(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 12)
}()
case .paxcounter?: try {
guard case .paxcounter(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 13)
}()
case .statusmessage?: try {
guard case .statusmessage(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 14)
}()
case .trafficManagement?: try {
guard case .trafficManagement(let v)? = self.payloadVariant else { preconditionFailure() }
try visitor.visitSingularMessageField(value: v, fieldNumber: 15)
}()
case nil: break
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig, rhs: ModuleConfig) -> Bool {
if lhs.payloadVariant != rhs.payloadVariant {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".MQTTConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{1}address\0\u{1}username\0\u{1}password\0\u{3}encryption_enabled\0\u{3}json_enabled\0\u{3}tls_enabled\0\u{1}root\0\u{3}proxy_to_client_enabled\0\u{3}map_reporting_enabled\0\u{3}map_report_settings\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularStringField(value: &self.address) }()
case 3: try { try decoder.decodeSingularStringField(value: &self.username) }()
case 4: try { try decoder.decodeSingularStringField(value: &self.password) }()
case 5: try { try decoder.decodeSingularBoolField(value: &self.encryptionEnabled) }()
case 6: try { try decoder.decodeSingularBoolField(value: &self.jsonEnabled) }()
case 7: try { try decoder.decodeSingularBoolField(value: &self.tlsEnabled) }()
case 8: try { try decoder.decodeSingularStringField(value: &self.root) }()
case 9: try { try decoder.decodeSingularBoolField(value: &self.proxyToClientEnabled) }()
case 10: try { try decoder.decodeSingularBoolField(value: &self.mapReportingEnabled) }()
case 11: try { try decoder.decodeSingularMessageField(value: &self._mapReportSettings) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every if/case branch local when no optimizations
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
// https://github.com/apple/swift-protobuf/issues/1182
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if !self.address.isEmpty {
try visitor.visitSingularStringField(value: self.address, fieldNumber: 2)
}
if !self.username.isEmpty {
try visitor.visitSingularStringField(value: self.username, fieldNumber: 3)
}
if !self.password.isEmpty {
try visitor.visitSingularStringField(value: self.password, fieldNumber: 4)
}
if self.encryptionEnabled != false {
try visitor.visitSingularBoolField(value: self.encryptionEnabled, fieldNumber: 5)
}
if self.jsonEnabled != false {
try visitor.visitSingularBoolField(value: self.jsonEnabled, fieldNumber: 6)
}
if self.tlsEnabled != false {
try visitor.visitSingularBoolField(value: self.tlsEnabled, fieldNumber: 7)
}
if !self.root.isEmpty {
try visitor.visitSingularStringField(value: self.root, fieldNumber: 8)
}
if self.proxyToClientEnabled != false {
try visitor.visitSingularBoolField(value: self.proxyToClientEnabled, fieldNumber: 9)
}
if self.mapReportingEnabled != false {
try visitor.visitSingularBoolField(value: self.mapReportingEnabled, fieldNumber: 10)
}
try { if let v = self._mapReportSettings {
try visitor.visitSingularMessageField(value: v, fieldNumber: 11)
} }()
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.MQTTConfig, rhs: ModuleConfig.MQTTConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.address != rhs.address {return false}
if lhs.username != rhs.username {return false}
if lhs.password != rhs.password {return false}
if lhs.encryptionEnabled != rhs.encryptionEnabled {return false}
if lhs.jsonEnabled != rhs.jsonEnabled {return false}
if lhs.tlsEnabled != rhs.tlsEnabled {return false}
if lhs.root != rhs.root {return false}
if lhs.proxyToClientEnabled != rhs.proxyToClientEnabled {return false}
if lhs.mapReportingEnabled != rhs.mapReportingEnabled {return false}
if lhs._mapReportSettings != rhs._mapReportSettings {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.MapReportSettings: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".MapReportSettings"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}publish_interval_secs\0\u{3}position_precision\0\u{3}should_report_location\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.publishIntervalSecs) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.positionPrecision) }()
case 3: try { try decoder.decodeSingularBoolField(value: &self.shouldReportLocation) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.publishIntervalSecs != 0 {
try visitor.visitSingularUInt32Field(value: self.publishIntervalSecs, fieldNumber: 1)
}
if self.positionPrecision != 0 {
try visitor.visitSingularUInt32Field(value: self.positionPrecision, fieldNumber: 2)
}
if self.shouldReportLocation != false {
try visitor.visitSingularBoolField(value: self.shouldReportLocation, fieldNumber: 3)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.MapReportSettings, rhs: ModuleConfig.MapReportSettings) -> Bool {
if lhs.publishIntervalSecs != rhs.publishIntervalSecs {return false}
if lhs.positionPrecision != rhs.positionPrecision {return false}
if lhs.shouldReportLocation != rhs.shouldReportLocation {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.RemoteHardwareConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".RemoteHardwareConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}allow_undefined_pin_access\0\u{3}available_pins\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularBoolField(value: &self.allowUndefinedPinAccess) }()
case 3: try { try decoder.decodeRepeatedMessageField(value: &self.availablePins) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.allowUndefinedPinAccess != false {
try visitor.visitSingularBoolField(value: self.allowUndefinedPinAccess, fieldNumber: 2)
}
if !self.availablePins.isEmpty {
try visitor.visitRepeatedMessageField(value: self.availablePins, fieldNumber: 3)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.RemoteHardwareConfig, rhs: ModuleConfig.RemoteHardwareConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.allowUndefinedPinAccess != rhs.allowUndefinedPinAccess {return false}
if lhs.availablePins != rhs.availablePins {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.NeighborInfoConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".NeighborInfoConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}update_interval\0\u{3}transmit_over_lora\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.updateInterval) }()
case 3: try { try decoder.decodeSingularBoolField(value: &self.transmitOverLora) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.updateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.updateInterval, fieldNumber: 2)
}
if self.transmitOverLora != false {
try visitor.visitSingularBoolField(value: self.transmitOverLora, fieldNumber: 3)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.NeighborInfoConfig, rhs: ModuleConfig.NeighborInfoConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.updateInterval != rhs.updateInterval {return false}
if lhs.transmitOverLora != rhs.transmitOverLora {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.DetectionSensorConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".DetectionSensorConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}minimum_broadcast_secs\0\u{3}state_broadcast_secs\0\u{3}send_bell\0\u{1}name\0\u{3}monitor_pin\0\u{3}detection_trigger_type\0\u{3}use_pullup\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.minimumBroadcastSecs) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.stateBroadcastSecs) }()
case 4: try { try decoder.decodeSingularBoolField(value: &self.sendBell) }()
case 5: try { try decoder.decodeSingularStringField(value: &self.name) }()
case 6: try { try decoder.decodeSingularUInt32Field(value: &self.monitorPin) }()
case 7: try { try decoder.decodeSingularEnumField(value: &self.detectionTriggerType) }()
case 8: try { try decoder.decodeSingularBoolField(value: &self.usePullup) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.minimumBroadcastSecs != 0 {
try visitor.visitSingularUInt32Field(value: self.minimumBroadcastSecs, fieldNumber: 2)
}
if self.stateBroadcastSecs != 0 {
try visitor.visitSingularUInt32Field(value: self.stateBroadcastSecs, fieldNumber: 3)
}
if self.sendBell != false {
try visitor.visitSingularBoolField(value: self.sendBell, fieldNumber: 4)
}
if !self.name.isEmpty {
try visitor.visitSingularStringField(value: self.name, fieldNumber: 5)
}
if self.monitorPin != 0 {
try visitor.visitSingularUInt32Field(value: self.monitorPin, fieldNumber: 6)
}
if self.detectionTriggerType != .logicLow {
try visitor.visitSingularEnumField(value: self.detectionTriggerType, fieldNumber: 7)
}
if self.usePullup != false {
try visitor.visitSingularBoolField(value: self.usePullup, fieldNumber: 8)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.DetectionSensorConfig, rhs: ModuleConfig.DetectionSensorConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.minimumBroadcastSecs != rhs.minimumBroadcastSecs {return false}
if lhs.stateBroadcastSecs != rhs.stateBroadcastSecs {return false}
if lhs.sendBell != rhs.sendBell {return false}
if lhs.name != rhs.name {return false}
if lhs.monitorPin != rhs.monitorPin {return false}
if lhs.detectionTriggerType != rhs.detectionTriggerType {return false}
if lhs.usePullup != rhs.usePullup {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.DetectionSensorConfig.TriggerType: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0LOGIC_LOW\0\u{1}LOGIC_HIGH\0\u{1}FALLING_EDGE\0\u{1}RISING_EDGE\0\u{1}EITHER_EDGE_ACTIVE_LOW\0\u{1}EITHER_EDGE_ACTIVE_HIGH\0")
}
extension ModuleConfig.AudioConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".AudioConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}codec2_enabled\0\u{3}ptt_pin\0\u{1}bitrate\0\u{3}i2s_ws\0\u{3}i2s_sd\0\u{3}i2s_din\0\u{3}i2s_sck\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.codec2Enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.pttPin) }()
case 3: try { try decoder.decodeSingularEnumField(value: &self.bitrate) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.i2SWs) }()
case 5: try { try decoder.decodeSingularUInt32Field(value: &self.i2SSd) }()
case 6: try { try decoder.decodeSingularUInt32Field(value: &self.i2SDin) }()
case 7: try { try decoder.decodeSingularUInt32Field(value: &self.i2SSck) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.codec2Enabled != false {
try visitor.visitSingularBoolField(value: self.codec2Enabled, fieldNumber: 1)
}
if self.pttPin != 0 {
try visitor.visitSingularUInt32Field(value: self.pttPin, fieldNumber: 2)
}
if self.bitrate != .codec2Default {
try visitor.visitSingularEnumField(value: self.bitrate, fieldNumber: 3)
}
if self.i2SWs != 0 {
try visitor.visitSingularUInt32Field(value: self.i2SWs, fieldNumber: 4)
}
if self.i2SSd != 0 {
try visitor.visitSingularUInt32Field(value: self.i2SSd, fieldNumber: 5)
}
if self.i2SDin != 0 {
try visitor.visitSingularUInt32Field(value: self.i2SDin, fieldNumber: 6)
}
if self.i2SSck != 0 {
try visitor.visitSingularUInt32Field(value: self.i2SSck, fieldNumber: 7)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.AudioConfig, rhs: ModuleConfig.AudioConfig) -> Bool {
if lhs.codec2Enabled != rhs.codec2Enabled {return false}
if lhs.pttPin != rhs.pttPin {return false}
if lhs.bitrate != rhs.bitrate {return false}
if lhs.i2SWs != rhs.i2SWs {return false}
if lhs.i2SSd != rhs.i2SSd {return false}
if lhs.i2SDin != rhs.i2SDin {return false}
if lhs.i2SSck != rhs.i2SSck {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.AudioConfig.Audio_Baud: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0CODEC2_DEFAULT\0\u{1}CODEC2_3200\0\u{1}CODEC2_2400\0\u{1}CODEC2_1600\0\u{1}CODEC2_1400\0\u{1}CODEC2_1300\0\u{1}CODEC2_1200\0\u{1}CODEC2_700\0\u{1}CODEC2_700B\0")
}
extension ModuleConfig.PaxcounterConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".PaxcounterConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}paxcounter_update_interval\0\u{3}wifi_threshold\0\u{3}ble_threshold\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.paxcounterUpdateInterval) }()
case 3: try { try decoder.decodeSingularInt32Field(value: &self.wifiThreshold) }()
case 4: try { try decoder.decodeSingularInt32Field(value: &self.bleThreshold) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.paxcounterUpdateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.paxcounterUpdateInterval, fieldNumber: 2)
}
if self.wifiThreshold != 0 {
try visitor.visitSingularInt32Field(value: self.wifiThreshold, fieldNumber: 3)
}
if self.bleThreshold != 0 {
try visitor.visitSingularInt32Field(value: self.bleThreshold, fieldNumber: 4)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.PaxcounterConfig, rhs: ModuleConfig.PaxcounterConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.paxcounterUpdateInterval != rhs.paxcounterUpdateInterval {return false}
if lhs.wifiThreshold != rhs.wifiThreshold {return false}
if lhs.bleThreshold != rhs.bleThreshold {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.TrafficManagementConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".TrafficManagementConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}position_dedup_enabled\0\u{3}position_precision_bits\0\u{3}position_min_interval_secs\0\u{3}nodeinfo_direct_response\0\u{3}nodeinfo_direct_response_max_hops\0\u{3}rate_limit_enabled\0\u{3}rate_limit_window_secs\0\u{3}rate_limit_max_packets\0\u{3}drop_unknown_enabled\0\u{3}unknown_packet_threshold\0\u{3}exhaust_hop_telemetry\0\u{3}exhaust_hop_position\0\u{3}router_preserve_hops\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularBoolField(value: &self.positionDedupEnabled) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.positionPrecisionBits) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.positionMinIntervalSecs) }()
case 5: try { try decoder.decodeSingularBoolField(value: &self.nodeinfoDirectResponse) }()
case 6: try { try decoder.decodeSingularUInt32Field(value: &self.nodeinfoDirectResponseMaxHops) }()
case 7: try { try decoder.decodeSingularBoolField(value: &self.rateLimitEnabled) }()
case 8: try { try decoder.decodeSingularUInt32Field(value: &self.rateLimitWindowSecs) }()
case 9: try { try decoder.decodeSingularUInt32Field(value: &self.rateLimitMaxPackets) }()
case 10: try { try decoder.decodeSingularBoolField(value: &self.dropUnknownEnabled) }()
case 11: try { try decoder.decodeSingularUInt32Field(value: &self.unknownPacketThreshold) }()
case 12: try { try decoder.decodeSingularBoolField(value: &self.exhaustHopTelemetry) }()
case 13: try { try decoder.decodeSingularBoolField(value: &self.exhaustHopPosition) }()
case 14: try { try decoder.decodeSingularBoolField(value: &self.routerPreserveHops) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.positionDedupEnabled != false {
try visitor.visitSingularBoolField(value: self.positionDedupEnabled, fieldNumber: 2)
}
if self.positionPrecisionBits != 0 {
try visitor.visitSingularUInt32Field(value: self.positionPrecisionBits, fieldNumber: 3)
}
if self.positionMinIntervalSecs != 0 {
try visitor.visitSingularUInt32Field(value: self.positionMinIntervalSecs, fieldNumber: 4)
}
if self.nodeinfoDirectResponse != false {
try visitor.visitSingularBoolField(value: self.nodeinfoDirectResponse, fieldNumber: 5)
}
if self.nodeinfoDirectResponseMaxHops != 0 {
try visitor.visitSingularUInt32Field(value: self.nodeinfoDirectResponseMaxHops, fieldNumber: 6)
}
if self.rateLimitEnabled != false {
try visitor.visitSingularBoolField(value: self.rateLimitEnabled, fieldNumber: 7)
}
if self.rateLimitWindowSecs != 0 {
try visitor.visitSingularUInt32Field(value: self.rateLimitWindowSecs, fieldNumber: 8)
}
if self.rateLimitMaxPackets != 0 {
try visitor.visitSingularUInt32Field(value: self.rateLimitMaxPackets, fieldNumber: 9)
}
if self.dropUnknownEnabled != false {
try visitor.visitSingularBoolField(value: self.dropUnknownEnabled, fieldNumber: 10)
}
if self.unknownPacketThreshold != 0 {
try visitor.visitSingularUInt32Field(value: self.unknownPacketThreshold, fieldNumber: 11)
}
if self.exhaustHopTelemetry != false {
try visitor.visitSingularBoolField(value: self.exhaustHopTelemetry, fieldNumber: 12)
}
if self.exhaustHopPosition != false {
try visitor.visitSingularBoolField(value: self.exhaustHopPosition, fieldNumber: 13)
}
if self.routerPreserveHops != false {
try visitor.visitSingularBoolField(value: self.routerPreserveHops, fieldNumber: 14)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.TrafficManagementConfig, rhs: ModuleConfig.TrafficManagementConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.positionDedupEnabled != rhs.positionDedupEnabled {return false}
if lhs.positionPrecisionBits != rhs.positionPrecisionBits {return false}
if lhs.positionMinIntervalSecs != rhs.positionMinIntervalSecs {return false}
if lhs.nodeinfoDirectResponse != rhs.nodeinfoDirectResponse {return false}
if lhs.nodeinfoDirectResponseMaxHops != rhs.nodeinfoDirectResponseMaxHops {return false}
if lhs.rateLimitEnabled != rhs.rateLimitEnabled {return false}
if lhs.rateLimitWindowSecs != rhs.rateLimitWindowSecs {return false}
if lhs.rateLimitMaxPackets != rhs.rateLimitMaxPackets {return false}
if lhs.dropUnknownEnabled != rhs.dropUnknownEnabled {return false}
if lhs.unknownPacketThreshold != rhs.unknownPacketThreshold {return false}
if lhs.exhaustHopTelemetry != rhs.exhaustHopTelemetry {return false}
if lhs.exhaustHopPosition != rhs.exhaustHopPosition {return false}
if lhs.routerPreserveHops != rhs.routerPreserveHops {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.SerialConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".SerialConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{1}echo\0\u{1}rxd\0\u{1}txd\0\u{1}baud\0\u{1}timeout\0\u{1}mode\0\u{3}override_console_serial_port\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularBoolField(value: &self.echo) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.rxd) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.txd) }()
case 5: try { try decoder.decodeSingularEnumField(value: &self.baud) }()
case 6: try { try decoder.decodeSingularUInt32Field(value: &self.timeout) }()
case 7: try { try decoder.decodeSingularEnumField(value: &self.mode) }()
case 8: try { try decoder.decodeSingularBoolField(value: &self.overrideConsoleSerialPort) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.echo != false {
try visitor.visitSingularBoolField(value: self.echo, fieldNumber: 2)
}
if self.rxd != 0 {
try visitor.visitSingularUInt32Field(value: self.rxd, fieldNumber: 3)
}
if self.txd != 0 {
try visitor.visitSingularUInt32Field(value: self.txd, fieldNumber: 4)
}
if self.baud != .baudDefault {
try visitor.visitSingularEnumField(value: self.baud, fieldNumber: 5)
}
if self.timeout != 0 {
try visitor.visitSingularUInt32Field(value: self.timeout, fieldNumber: 6)
}
if self.mode != .default {
try visitor.visitSingularEnumField(value: self.mode, fieldNumber: 7)
}
if self.overrideConsoleSerialPort != false {
try visitor.visitSingularBoolField(value: self.overrideConsoleSerialPort, fieldNumber: 8)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.SerialConfig, rhs: ModuleConfig.SerialConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.echo != rhs.echo {return false}
if lhs.rxd != rhs.rxd {return false}
if lhs.txd != rhs.txd {return false}
if lhs.baud != rhs.baud {return false}
if lhs.timeout != rhs.timeout {return false}
if lhs.mode != rhs.mode {return false}
if lhs.overrideConsoleSerialPort != rhs.overrideConsoleSerialPort {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.SerialConfig.Serial_Baud: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0BAUD_DEFAULT\0\u{1}BAUD_110\0\u{1}BAUD_300\0\u{1}BAUD_600\0\u{1}BAUD_1200\0\u{1}BAUD_2400\0\u{1}BAUD_4800\0\u{1}BAUD_9600\0\u{1}BAUD_19200\0\u{1}BAUD_38400\0\u{1}BAUD_57600\0\u{1}BAUD_115200\0\u{1}BAUD_230400\0\u{1}BAUD_460800\0\u{1}BAUD_576000\0\u{1}BAUD_921600\0")
}
extension ModuleConfig.SerialConfig.Serial_Mode: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0DEFAULT\0\u{1}SIMPLE\0\u{1}PROTO\0\u{1}TEXTMSG\0\u{1}NMEA\0\u{1}CALTOPO\0\u{1}WS85\0\u{1}VE_DIRECT\0\u{1}MS_CONFIG\0\u{1}LOG\0\u{1}LOGTEXT\0")
}
extension ModuleConfig.ExternalNotificationConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".ExternalNotificationConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{3}output_ms\0\u{1}output\0\u{1}active\0\u{3}alert_message\0\u{3}alert_bell\0\u{3}use_pwm\0\u{3}output_vibra\0\u{3}output_buzzer\0\u{3}alert_message_vibra\0\u{3}alert_message_buzzer\0\u{3}alert_bell_vibra\0\u{3}alert_bell_buzzer\0\u{3}nag_timeout\0\u{3}use_i2s_as_buzzer\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.outputMs) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.output) }()
case 4: try { try decoder.decodeSingularBoolField(value: &self.active) }()
case 5: try { try decoder.decodeSingularBoolField(value: &self.alertMessage) }()
case 6: try { try decoder.decodeSingularBoolField(value: &self.alertBell) }()
case 7: try { try decoder.decodeSingularBoolField(value: &self.usePwm) }()
case 8: try { try decoder.decodeSingularUInt32Field(value: &self.outputVibra) }()
case 9: try { try decoder.decodeSingularUInt32Field(value: &self.outputBuzzer) }()
case 10: try { try decoder.decodeSingularBoolField(value: &self.alertMessageVibra) }()
case 11: try { try decoder.decodeSingularBoolField(value: &self.alertMessageBuzzer) }()
case 12: try { try decoder.decodeSingularBoolField(value: &self.alertBellVibra) }()
case 13: try { try decoder.decodeSingularBoolField(value: &self.alertBellBuzzer) }()
case 14: try { try decoder.decodeSingularUInt32Field(value: &self.nagTimeout) }()
case 15: try { try decoder.decodeSingularBoolField(value: &self.useI2SAsBuzzer) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.outputMs != 0 {
try visitor.visitSingularUInt32Field(value: self.outputMs, fieldNumber: 2)
}
if self.output != 0 {
try visitor.visitSingularUInt32Field(value: self.output, fieldNumber: 3)
}
if self.active != false {
try visitor.visitSingularBoolField(value: self.active, fieldNumber: 4)
}
if self.alertMessage != false {
try visitor.visitSingularBoolField(value: self.alertMessage, fieldNumber: 5)
}
if self.alertBell != false {
try visitor.visitSingularBoolField(value: self.alertBell, fieldNumber: 6)
}
if self.usePwm != false {
try visitor.visitSingularBoolField(value: self.usePwm, fieldNumber: 7)
}
if self.outputVibra != 0 {
try visitor.visitSingularUInt32Field(value: self.outputVibra, fieldNumber: 8)
}
if self.outputBuzzer != 0 {
try visitor.visitSingularUInt32Field(value: self.outputBuzzer, fieldNumber: 9)
}
if self.alertMessageVibra != false {
try visitor.visitSingularBoolField(value: self.alertMessageVibra, fieldNumber: 10)
}
if self.alertMessageBuzzer != false {
try visitor.visitSingularBoolField(value: self.alertMessageBuzzer, fieldNumber: 11)
}
if self.alertBellVibra != false {
try visitor.visitSingularBoolField(value: self.alertBellVibra, fieldNumber: 12)
}
if self.alertBellBuzzer != false {
try visitor.visitSingularBoolField(value: self.alertBellBuzzer, fieldNumber: 13)
}
if self.nagTimeout != 0 {
try visitor.visitSingularUInt32Field(value: self.nagTimeout, fieldNumber: 14)
}
if self.useI2SAsBuzzer != false {
try visitor.visitSingularBoolField(value: self.useI2SAsBuzzer, fieldNumber: 15)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.ExternalNotificationConfig, rhs: ModuleConfig.ExternalNotificationConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.outputMs != rhs.outputMs {return false}
if lhs.output != rhs.output {return false}
if lhs.outputVibra != rhs.outputVibra {return false}
if lhs.outputBuzzer != rhs.outputBuzzer {return false}
if lhs.active != rhs.active {return false}
if lhs.alertMessage != rhs.alertMessage {return false}
if lhs.alertMessageVibra != rhs.alertMessageVibra {return false}
if lhs.alertMessageBuzzer != rhs.alertMessageBuzzer {return false}
if lhs.alertBell != rhs.alertBell {return false}
if lhs.alertBellVibra != rhs.alertBellVibra {return false}
if lhs.alertBellBuzzer != rhs.alertBellBuzzer {return false}
if lhs.usePwm != rhs.usePwm {return false}
if lhs.nagTimeout != rhs.nagTimeout {return false}
if lhs.useI2SAsBuzzer != rhs.useI2SAsBuzzer {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.StoreForwardConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".StoreForwardConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{1}heartbeat\0\u{1}records\0\u{3}history_return_max\0\u{3}history_return_window\0\u{3}is_server\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularBoolField(value: &self.heartbeat) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.records) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.historyReturnMax) }()
case 5: try { try decoder.decodeSingularUInt32Field(value: &self.historyReturnWindow) }()
case 6: try { try decoder.decodeSingularBoolField(value: &self.isServer) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.heartbeat != false {
try visitor.visitSingularBoolField(value: self.heartbeat, fieldNumber: 2)
}
if self.records != 0 {
try visitor.visitSingularUInt32Field(value: self.records, fieldNumber: 3)
}
if self.historyReturnMax != 0 {
try visitor.visitSingularUInt32Field(value: self.historyReturnMax, fieldNumber: 4)
}
if self.historyReturnWindow != 0 {
try visitor.visitSingularUInt32Field(value: self.historyReturnWindow, fieldNumber: 5)
}
if self.isServer != false {
try visitor.visitSingularBoolField(value: self.isServer, fieldNumber: 6)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.StoreForwardConfig, rhs: ModuleConfig.StoreForwardConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.heartbeat != rhs.heartbeat {return false}
if lhs.records != rhs.records {return false}
if lhs.historyReturnMax != rhs.historyReturnMax {return false}
if lhs.historyReturnWindow != rhs.historyReturnWindow {return false}
if lhs.isServer != rhs.isServer {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.RangeTestConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".RangeTestConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}enabled\0\u{1}sender\0\u{1}save\0\u{3}clear_on_reboot\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.sender) }()
case 3: try { try decoder.decodeSingularBoolField(value: &self.save) }()
case 4: try { try decoder.decodeSingularBoolField(value: &self.clearOnReboot_p) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1)
}
if self.sender != 0 {
try visitor.visitSingularUInt32Field(value: self.sender, fieldNumber: 2)
}
if self.save != false {
try visitor.visitSingularBoolField(value: self.save, fieldNumber: 3)
}
if self.clearOnReboot_p != false {
try visitor.visitSingularBoolField(value: self.clearOnReboot_p, fieldNumber: 4)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.RangeTestConfig, rhs: ModuleConfig.RangeTestConfig) -> Bool {
if lhs.enabled != rhs.enabled {return false}
if lhs.sender != rhs.sender {return false}
if lhs.save != rhs.save {return false}
if lhs.clearOnReboot_p != rhs.clearOnReboot_p {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.TelemetryConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".TelemetryConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}device_update_interval\0\u{3}environment_update_interval\0\u{3}environment_measurement_enabled\0\u{3}environment_screen_enabled\0\u{3}environment_display_fahrenheit\0\u{3}air_quality_enabled\0\u{3}air_quality_interval\0\u{3}power_measurement_enabled\0\u{3}power_update_interval\0\u{3}power_screen_enabled\0\u{3}health_measurement_enabled\0\u{3}health_update_interval\0\u{3}health_screen_enabled\0\u{3}device_telemetry_enabled\0\u{3}air_quality_screen_enabled\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.deviceUpdateInterval) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.environmentUpdateInterval) }()
case 3: try { try decoder.decodeSingularBoolField(value: &self.environmentMeasurementEnabled) }()
case 4: try { try decoder.decodeSingularBoolField(value: &self.environmentScreenEnabled) }()
case 5: try { try decoder.decodeSingularBoolField(value: &self.environmentDisplayFahrenheit) }()
case 6: try { try decoder.decodeSingularBoolField(value: &self.airQualityEnabled) }()
case 7: try { try decoder.decodeSingularUInt32Field(value: &self.airQualityInterval) }()
case 8: try { try decoder.decodeSingularBoolField(value: &self.powerMeasurementEnabled) }()
case 9: try { try decoder.decodeSingularUInt32Field(value: &self.powerUpdateInterval) }()
case 10: try { try decoder.decodeSingularBoolField(value: &self.powerScreenEnabled) }()
case 11: try { try decoder.decodeSingularBoolField(value: &self.healthMeasurementEnabled) }()
case 12: try { try decoder.decodeSingularUInt32Field(value: &self.healthUpdateInterval) }()
case 13: try { try decoder.decodeSingularBoolField(value: &self.healthScreenEnabled) }()
case 14: try { try decoder.decodeSingularBoolField(value: &self.deviceTelemetryEnabled) }()
case 15: try { try decoder.decodeSingularBoolField(value: &self.airQualityScreenEnabled) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.deviceUpdateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.deviceUpdateInterval, fieldNumber: 1)
}
if self.environmentUpdateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.environmentUpdateInterval, fieldNumber: 2)
}
if self.environmentMeasurementEnabled != false {
try visitor.visitSingularBoolField(value: self.environmentMeasurementEnabled, fieldNumber: 3)
}
if self.environmentScreenEnabled != false {
try visitor.visitSingularBoolField(value: self.environmentScreenEnabled, fieldNumber: 4)
}
if self.environmentDisplayFahrenheit != false {
try visitor.visitSingularBoolField(value: self.environmentDisplayFahrenheit, fieldNumber: 5)
}
if self.airQualityEnabled != false {
try visitor.visitSingularBoolField(value: self.airQualityEnabled, fieldNumber: 6)
}
if self.airQualityInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.airQualityInterval, fieldNumber: 7)
}
if self.powerMeasurementEnabled != false {
try visitor.visitSingularBoolField(value: self.powerMeasurementEnabled, fieldNumber: 8)
}
if self.powerUpdateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.powerUpdateInterval, fieldNumber: 9)
}
if self.powerScreenEnabled != false {
try visitor.visitSingularBoolField(value: self.powerScreenEnabled, fieldNumber: 10)
}
if self.healthMeasurementEnabled != false {
try visitor.visitSingularBoolField(value: self.healthMeasurementEnabled, fieldNumber: 11)
}
if self.healthUpdateInterval != 0 {
try visitor.visitSingularUInt32Field(value: self.healthUpdateInterval, fieldNumber: 12)
}
if self.healthScreenEnabled != false {
try visitor.visitSingularBoolField(value: self.healthScreenEnabled, fieldNumber: 13)
}
if self.deviceTelemetryEnabled != false {
try visitor.visitSingularBoolField(value: self.deviceTelemetryEnabled, fieldNumber: 14)
}
if self.airQualityScreenEnabled != false {
try visitor.visitSingularBoolField(value: self.airQualityScreenEnabled, fieldNumber: 15)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.TelemetryConfig, rhs: ModuleConfig.TelemetryConfig) -> Bool {
if lhs.deviceUpdateInterval != rhs.deviceUpdateInterval {return false}
if lhs.environmentUpdateInterval != rhs.environmentUpdateInterval {return false}
if lhs.environmentMeasurementEnabled != rhs.environmentMeasurementEnabled {return false}
if lhs.environmentScreenEnabled != rhs.environmentScreenEnabled {return false}
if lhs.environmentDisplayFahrenheit != rhs.environmentDisplayFahrenheit {return false}
if lhs.airQualityEnabled != rhs.airQualityEnabled {return false}
if lhs.airQualityInterval != rhs.airQualityInterval {return false}
if lhs.powerMeasurementEnabled != rhs.powerMeasurementEnabled {return false}
if lhs.powerUpdateInterval != rhs.powerUpdateInterval {return false}
if lhs.powerScreenEnabled != rhs.powerScreenEnabled {return false}
if lhs.healthMeasurementEnabled != rhs.healthMeasurementEnabled {return false}
if lhs.healthUpdateInterval != rhs.healthUpdateInterval {return false}
if lhs.healthScreenEnabled != rhs.healthScreenEnabled {return false}
if lhs.deviceTelemetryEnabled != rhs.deviceTelemetryEnabled {return false}
if lhs.airQualityScreenEnabled != rhs.airQualityScreenEnabled {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.CannedMessageConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".CannedMessageConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}rotary1_enabled\0\u{3}inputbroker_pin_a\0\u{3}inputbroker_pin_b\0\u{3}inputbroker_pin_press\0\u{3}inputbroker_event_cw\0\u{3}inputbroker_event_ccw\0\u{3}inputbroker_event_press\0\u{3}updown1_enabled\0\u{1}enabled\0\u{3}allow_input_source\0\u{3}send_bell\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.rotary1Enabled) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.inputbrokerPinA) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.inputbrokerPinB) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.inputbrokerPinPress) }()
case 5: try { try decoder.decodeSingularEnumField(value: &self.inputbrokerEventCw) }()
case 6: try { try decoder.decodeSingularEnumField(value: &self.inputbrokerEventCcw) }()
case 7: try { try decoder.decodeSingularEnumField(value: &self.inputbrokerEventPress) }()
case 8: try { try decoder.decodeSingularBoolField(value: &self.updown1Enabled) }()
case 9: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
case 10: try { try decoder.decodeSingularStringField(value: &self.allowInputSource) }()
case 11: try { try decoder.decodeSingularBoolField(value: &self.sendBell) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.rotary1Enabled != false {
try visitor.visitSingularBoolField(value: self.rotary1Enabled, fieldNumber: 1)
}
if self.inputbrokerPinA != 0 {
try visitor.visitSingularUInt32Field(value: self.inputbrokerPinA, fieldNumber: 2)
}
if self.inputbrokerPinB != 0 {
try visitor.visitSingularUInt32Field(value: self.inputbrokerPinB, fieldNumber: 3)
}
if self.inputbrokerPinPress != 0 {
try visitor.visitSingularUInt32Field(value: self.inputbrokerPinPress, fieldNumber: 4)
}
if self.inputbrokerEventCw != .none {
try visitor.visitSingularEnumField(value: self.inputbrokerEventCw, fieldNumber: 5)
}
if self.inputbrokerEventCcw != .none {
try visitor.visitSingularEnumField(value: self.inputbrokerEventCcw, fieldNumber: 6)
}
if self.inputbrokerEventPress != .none {
try visitor.visitSingularEnumField(value: self.inputbrokerEventPress, fieldNumber: 7)
}
if self.updown1Enabled != false {
try visitor.visitSingularBoolField(value: self.updown1Enabled, fieldNumber: 8)
}
if self.enabled != false {
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 9)
}
if !self.allowInputSource.isEmpty {
try visitor.visitSingularStringField(value: self.allowInputSource, fieldNumber: 10)
}
if self.sendBell != false {
try visitor.visitSingularBoolField(value: self.sendBell, fieldNumber: 11)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.CannedMessageConfig, rhs: ModuleConfig.CannedMessageConfig) -> Bool {
if lhs.rotary1Enabled != rhs.rotary1Enabled {return false}
if lhs.inputbrokerPinA != rhs.inputbrokerPinA {return false}
if lhs.inputbrokerPinB != rhs.inputbrokerPinB {return false}
if lhs.inputbrokerPinPress != rhs.inputbrokerPinPress {return false}
if lhs.inputbrokerEventCw != rhs.inputbrokerEventCw {return false}
if lhs.inputbrokerEventCcw != rhs.inputbrokerEventCcw {return false}
if lhs.inputbrokerEventPress != rhs.inputbrokerEventPress {return false}
if lhs.updown1Enabled != rhs.updown1Enabled {return false}
if lhs.enabled != rhs.enabled {return false}
if lhs.allowInputSource != rhs.allowInputSource {return false}
if lhs.sendBell != rhs.sendBell {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.CannedMessageConfig.InputEventChar: SwiftProtobuf._ProtoNameProviding {
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0NONE\0\u{2}\u{a}SELECT\0\u{2}\u{7}UP\0\u{1}DOWN\0\u{1}LEFT\0\u{1}RIGHT\0\u{2}\u{4}CANCEL\0\u{2}\u{3}BACK\0")
}
extension ModuleConfig.AmbientLightingConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".AmbientLightingConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}led_state\0\u{1}current\0\u{1}red\0\u{1}green\0\u{1}blue\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularBoolField(value: &self.ledState) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.current) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.red) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.green) }()
case 5: try { try decoder.decodeSingularUInt32Field(value: &self.blue) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.ledState != false {
try visitor.visitSingularBoolField(value: self.ledState, fieldNumber: 1)
}
if self.current != 0 {
try visitor.visitSingularUInt32Field(value: self.current, fieldNumber: 2)
}
if self.red != 0 {
try visitor.visitSingularUInt32Field(value: self.red, fieldNumber: 3)
}
if self.green != 0 {
try visitor.visitSingularUInt32Field(value: self.green, fieldNumber: 4)
}
if self.blue != 0 {
try visitor.visitSingularUInt32Field(value: self.blue, fieldNumber: 5)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.AmbientLightingConfig, rhs: ModuleConfig.AmbientLightingConfig) -> Bool {
if lhs.ledState != rhs.ledState {return false}
if lhs.current != rhs.current {return false}
if lhs.red != rhs.red {return false}
if lhs.green != rhs.green {return false}
if lhs.blue != rhs.blue {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension ModuleConfig.StatusMessageConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = ModuleConfig.protoMessageName + ".StatusMessageConfig"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}node_status\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularStringField(value: &self.nodeStatus) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if !self.nodeStatus.isEmpty {
try visitor.visitSingularStringField(value: self.nodeStatus, fieldNumber: 1)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: ModuleConfig.StatusMessageConfig, rhs: ModuleConfig.StatusMessageConfig) -> Bool {
if lhs.nodeStatus != rhs.nodeStatus {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}
extension RemoteHardwarePin: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
public static let protoMessageName: String = _protobuf_package + ".RemoteHardwarePin"
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}gpio_pin\0\u{1}name\0\u{1}type\0")
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
while let fieldNumber = try decoder.nextFieldNumber() {
// The use of inline closures is to circumvent an issue where the compiler
// allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.gpioPin) }()
case 2: try { try decoder.decodeSingularStringField(value: &self.name) }()
case 3: try { try decoder.decodeSingularEnumField(value: &self.type) }()
default: break
}
}
}
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.gpioPin != 0 {
try visitor.visitSingularUInt32Field(value: self.gpioPin, fieldNumber: 1)
}
if !self.name.isEmpty {
try visitor.visitSingularStringField(value: self.name, fieldNumber: 2)
}
if self.type != .unknown {
try visitor.visitSingularEnumField(value: self.type, fieldNumber: 3)
}
try unknownFields.traverse(visitor: &visitor)
}
public static func ==(lhs: RemoteHardwarePin, rhs: RemoteHardwarePin) -> Bool {
if lhs.gpioPin != rhs.gpioPin {return false}
if lhs.name != rhs.name {return false}
if lhs.type != rhs.type {return false}
if lhs.unknownFields != rhs.unknownFields {return false}
return true
}
}