Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e9864f8
Tips robot virtual node / relayer to different LoRa modes & channels
erayd Jun 30, 2025
3ba64b3
fix: repair mesh tips CI build
Komzpa May 17, 2026
e380d96
feat: add MeshBeacon module (Phase 1 — proto + generated code + initi…
NomDeTom Jun 2, 2026
dd57b9e
feat(beacon): implement broadcaster + listener (phases 2-5)
NomDeTom Jun 2, 2026
a05d38a
feat(beacon): wire RadioLibInterface hooks + admin validation (phases…
NomDeTom Jun 2, 2026
98e068b
fix(beacon): fix LocalModuleConfig flat access (no payload_variant), …
NomDeTom Jun 2, 2026
66c089c
feat(beacon): fix broadcaster inheritance, add preset/region validati…
NomDeTom Jun 2, 2026
e0a369d
feat(beacon): add unit tests for MeshBeaconModule and AdminModule con…
NomDeTom Jun 3, 2026
819cfb8
remove old meshtips
NomDeTom Jun 3, 2026
74af323
more validation in NodeDB and AdminModule, and userprefs for baked i…
NomDeTom Jun 3, 2026
7e8b749
copilot is my gravity
NomDeTom Jun 3, 2026
112c437
mmmmm... beacon
NomDeTom Jun 3, 2026
41bd325
oops
NomDeTom Jun 3, 2026
6ef0b5a
Enhance unit tests for MeshBeaconModule with detailed validation chec…
NomDeTom Jun 3, 2026
2a8a643
new lines. Why not?
NomDeTom Jun 3, 2026
d27a9e6
finally
NomDeTom Jun 3, 2026
f23fbd6
legacy mode activate!
NomDeTom Jun 3, 2026
34fbac5
Update protobufs (#16)
github-actions[bot] Jun 3, 2026
98c14b4
Update protobufs (#17)
github-actions[bot] Jun 3, 2026
f2cb730
better logic, fixed a test
NomDeTom Jun 15, 2026
785a0c7
updated for packet signing
NomDeTom Jun 15, 2026
a6876ac
Merge branch 'meshtastic:develop' into feat/mesh-beacon
NomDeTom Jun 15, 2026
290f553
channel numbers
NomDeTom Jun 15, 2026
fe6f2d0
beacon: encrypt on the beacon channel PSK; fix split note
NomDeTom Jun 15, 2026
5eeaa88
test/beacon: drain toPhoneQueue in tearDown to fix LSan leak abort
NomDeTom Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/mesh/Channels.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ class Channels

bool setDefaultPresetCryptoForHash(ChannelHash channelHash);

/**
* Validate a channel, fixing any errors as needed
*/
meshtastic_Channel &fixupChannel(ChannelIndex chIndex);

int16_t getHash(ChannelIndex i) { return hashes[i]; }

private:
Expand All @@ -118,11 +123,6 @@ class Channels
*/
int16_t generateHash(ChannelIndex channelNum);

/**
* Validate a channel, fixing any errors as needed
*/
meshtastic_Channel &fixupChannel(ChannelIndex chIndex);

/**
* Writes the default lora config
*/
Expand Down
1 change: 1 addition & 0 deletions src/mesh/Default.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#define default_screen_on_secs IF_ROUTER(1, 60 * 10)
#define default_node_info_broadcast_secs 3 * 60 * 60
#define default_neighbor_info_broadcast_secs 6 * 60 * 60
#define default_mesh_beacon_min_broadcast_interval_secs 3600
#define min_node_info_broadcast_secs 60 * 60 // No regular broadcasts of more than once an hour
#define min_neighbor_info_broadcast_secs 4 * 60 * 60
#define default_map_publish_interval_secs 60 * 60
Expand Down
68 changes: 68 additions & 0 deletions src/mesh/NodeDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1177,6 +1177,73 @@ void NodeDB::installDefaultModuleConfig()
moduleConfig.ambient_lighting.green = (myNodeInfo.my_node_num & 0x00FF00) >> 8;
moduleConfig.ambient_lighting.blue = myNodeInfo.my_node_num & 0x0000FF;

#if !MESHTASTIC_EXCLUDE_BEACON
moduleConfig.has_mesh_beacon = true;
moduleConfig.mesh_beacon.listen_enabled = true;
moduleConfig.mesh_beacon.broadcast_enabled = false;
moduleConfig.mesh_beacon.broadcast_legacy_split = true;
#ifdef USERPREFS_MESH_BEACON_LISTEN_ENABLED
moduleConfig.mesh_beacon.listen_enabled = USERPREFS_MESH_BEACON_LISTEN_ENABLED;
#endif
#ifdef USERPREFS_MESH_BEACON_BROADCAST_ENABLED
moduleConfig.mesh_beacon.broadcast_enabled = USERPREFS_MESH_BEACON_BROADCAST_ENABLED;
#endif
#ifdef USERPREFS_MESH_BEACON_MESSAGE
strncpy(moduleConfig.mesh_beacon.broadcast_message, USERPREFS_MESH_BEACON_MESSAGE,
sizeof(moduleConfig.mesh_beacon.broadcast_message) - 1);
#endif
#ifdef USERPREFS_MESH_BEACON_INTERVAL_SECS
moduleConfig.mesh_beacon.broadcast_interval_secs =
(USERPREFS_MESH_BEACON_INTERVAL_SECS != 0 &&
USERPREFS_MESH_BEACON_INTERVAL_SECS < default_mesh_beacon_min_broadcast_interval_secs)
? default_mesh_beacon_min_broadcast_interval_secs
: USERPREFS_MESH_BEACON_INTERVAL_SECS;
Comment thread
NomDeTom marked this conversation as resolved.
#endif
#ifdef USERPREFS_MESH_BEACON_OFFER_PRESET
moduleConfig.mesh_beacon.has_broadcast_offer_preset = true;
moduleConfig.mesh_beacon.broadcast_offer_preset = USERPREFS_MESH_BEACON_OFFER_PRESET;
#endif
#ifdef USERPREFS_MESH_BEACON_OFFER_REGION
moduleConfig.mesh_beacon.broadcast_offer_region = USERPREFS_MESH_BEACON_OFFER_REGION;
#endif
#ifdef USERPREFS_MESH_BEACON_OFFER_CHANNEL_NAME
moduleConfig.mesh_beacon.has_broadcast_offer_channel = true;
strncpy(moduleConfig.mesh_beacon.broadcast_offer_channel.name, USERPREFS_MESH_BEACON_OFFER_CHANNEL_NAME,
sizeof(moduleConfig.mesh_beacon.broadcast_offer_channel.name) - 1);
#endif
#ifdef USERPREFS_MESH_BEACON_OFFER_CHANNEL_PSK
moduleConfig.mesh_beacon.has_broadcast_offer_channel = true;
static const uint8_t beaconOfferPsk[] = USERPREFS_MESH_BEACON_OFFER_CHANNEL_PSK;
memcpy(moduleConfig.mesh_beacon.broadcast_offer_channel.psk.bytes, beaconOfferPsk, sizeof(beaconOfferPsk));
moduleConfig.mesh_beacon.broadcast_offer_channel.psk.size = sizeof(beaconOfferPsk);
#endif
#ifdef USERPREFS_MESH_BEACON_ON_PRESET
moduleConfig.mesh_beacon.has_broadcast_on_preset = true;
moduleConfig.mesh_beacon.broadcast_on_preset = USERPREFS_MESH_BEACON_ON_PRESET;
#endif
#ifdef USERPREFS_MESH_BEACON_ON_REGION
moduleConfig.mesh_beacon.broadcast_on_region = USERPREFS_MESH_BEACON_ON_REGION;
#endif
#ifdef USERPREFS_MESH_BEACON_ON_CHANNEL_NAME
moduleConfig.mesh_beacon.has_broadcast_on_channel = true;
strncpy(moduleConfig.mesh_beacon.broadcast_on_channel.name, USERPREFS_MESH_BEACON_ON_CHANNEL_NAME,
sizeof(moduleConfig.mesh_beacon.broadcast_on_channel.name) - 1);
#endif
#ifdef USERPREFS_MESH_BEACON_ON_CHANNEL_PSK
moduleConfig.mesh_beacon.has_broadcast_on_channel = true;
static const uint8_t beaconOnPsk[] = USERPREFS_MESH_BEACON_ON_CHANNEL_PSK;
memcpy(moduleConfig.mesh_beacon.broadcast_on_channel.psk.bytes, beaconOnPsk, sizeof(beaconOnPsk));
moduleConfig.mesh_beacon.broadcast_on_channel.psk.size = sizeof(beaconOnPsk);
#endif
#ifdef USERPREFS_MESH_BEACON_ON_CHANNEL_NUM
moduleConfig.mesh_beacon.has_broadcast_on_channel = true;
moduleConfig.mesh_beacon.broadcast_on_channel.channel_num = USERPREFS_MESH_BEACON_ON_CHANNEL_NUM;
#endif
#ifdef USERPREFS_MESH_BEACON_LEGACY_SPLIT
moduleConfig.mesh_beacon.broadcast_legacy_split = USERPREFS_MESH_BEACON_LEGACY_SPLIT;
#endif
#endif // !MESHTASTIC_EXCLUDE_BEACON

initModuleConfigIntervals();
}

Expand Down Expand Up @@ -2377,6 +2444,7 @@ bool NodeDB::saveToDiskNoRetry(int saveWhat)
moduleConfig.has_audio = true;
moduleConfig.has_paxcounter = true;
moduleConfig.has_statusmessage = true;
moduleConfig.has_mesh_beacon = true;

success &=
saveProto(moduleConfigFileName, meshtastic_LocalModuleConfig_size, &meshtastic_LocalModuleConfig_msg, &moduleConfig);
Expand Down
30 changes: 29 additions & 1 deletion src/mesh/RadioLibInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
#include "error.h"
#include "main.h"
#include "mesh-pb-constants.h"
#if !MESHTASTIC_EXCLUDE_BEACON
#include "modules/MeshBeaconModule.h"
#endif
#include <pb_decode.h>
#include <pb_encode.h>

Expand Down Expand Up @@ -366,6 +369,9 @@ void RadioLibInterface::onNotify(uint32_t notification)
switch (notification) {
case ISR_TX:
handleTransmitInterrupt();
#if !MESHTASTIC_EXCLUDE_BEACON
MeshBeaconModule::reconfigureForBeaconTX(this, txQueue.getFront());
#endif
startReceive();
setTransmitDelay();
break;
Expand All @@ -388,9 +394,27 @@ void RadioLibInterface::onNotify(uint32_t notification)
if (delay_remaining > 0) {
// There's still some delay pending on this packet, so resume waiting for it to elapse
notifyLater(delay_remaining, TRANSMIT_DELAY_COMPLETED, false);
#if !MESHTASTIC_EXCLUDE_BEACON
} else if (MeshBeaconModule::beaconTxConfigInvalid(txp)) {
// The beacon's target radio config is invalid (bad preset/region, or an
// unlicensed node keying up on a ham-only region). Drop the packet — never
// transmit it on the current (home) config — and move on to the next queued packet.
LOG_DEBUG("Beacon: invalid TX radio config, dropping packet 0x%08x", txp->id);
meshtastic_MeshPacket *bad = txQueue.dequeue();
MeshBeaconModule::clearTargetRadioSettings(bad);
packetPool.release(bad);
setTransmitDelay();
} else if (MeshBeaconModule::reconfigureForBeaconTX(this, txp)) {
setTransmitDelay();
#endif
} else {
if (isChannelActive()) { // check if there is currently a LoRa packet on the channel
startReceive(); // try receiving this packet, afterwards we'll be trying to transmit again
#if !MESHTASTIC_EXCLUDE_BEACON
if (!MeshBeaconModule::hasTargetRadioSettings(txp))
#endif
{
startReceive(); // try receiving this packet, afterwards we'll be trying to transmit again
}
setTransmitDelay();
} else {
// Send any outgoing packets we have ready as fast as possible to keep the time between channel scan and
Expand Down Expand Up @@ -522,6 +546,10 @@ void RadioLibInterface::completeSending()
if (!isFromUs(p))
txRelay++;
printPacket("Completed sending", p);
#if !MESHTASTIC_EXCLUDE_BEACON
MeshBeaconModule::clearTargetRadioSettings(p);
MeshBeaconModule::reconfigureForBeaconTX(this, nullptr);
#endif

// We are done sending that packet, release it
packetPool.release(p);
Expand Down
2 changes: 1 addition & 1 deletion src/mesh/generated/meshtastic/deviceonly.pb.h
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ extern const pb_msgdesc_t meshtastic_BackupPreferences_msg;
/* Maximum encoded size of messages (where known) */
/* meshtastic_NodeDatabase_size depends on runtime parameters */
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_BackupPreferences_size
#define meshtastic_BackupPreferences_size 2432
#define meshtastic_BackupPreferences_size 2712
#define meshtastic_ChannelFile_size 718
#define meshtastic_DeviceState_size 1944
#define meshtastic_NodeEnvironmentEntry_size 170
Expand Down
14 changes: 10 additions & 4 deletions src/mesh/generated/meshtastic/localonly.pb.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ typedef struct _meshtastic_LocalModuleConfig {
/* TAK Config */
bool has_tak;
meshtastic_ModuleConfig_TAKConfig tak;
/* MeshBeacon Config */
bool has_mesh_beacon;
meshtastic_ModuleConfig_MeshBeaconConfig mesh_beacon;
} meshtastic_LocalModuleConfig;


Expand All @@ -105,9 +108,9 @@ extern "C" {

/* Initializer values for message structs */
#define meshtastic_LocalConfig_init_default {false, meshtastic_Config_DeviceConfig_init_default, false, meshtastic_Config_PositionConfig_init_default, false, meshtastic_Config_PowerConfig_init_default, false, meshtastic_Config_NetworkConfig_init_default, false, meshtastic_Config_DisplayConfig_init_default, false, meshtastic_Config_LoRaConfig_init_default, false, meshtastic_Config_BluetoothConfig_init_default, 0, false, meshtastic_Config_SecurityConfig_init_default}
#define meshtastic_LocalModuleConfig_init_default {false, meshtastic_ModuleConfig_MQTTConfig_init_default, false, meshtastic_ModuleConfig_SerialConfig_init_default, false, meshtastic_ModuleConfig_ExternalNotificationConfig_init_default, false, meshtastic_ModuleConfig_StoreForwardConfig_init_default, false, meshtastic_ModuleConfig_RangeTestConfig_init_default, false, meshtastic_ModuleConfig_TelemetryConfig_init_default, false, meshtastic_ModuleConfig_CannedMessageConfig_init_default, 0, false, meshtastic_ModuleConfig_AudioConfig_init_default, false, meshtastic_ModuleConfig_RemoteHardwareConfig_init_default, false, meshtastic_ModuleConfig_NeighborInfoConfig_init_default, false, meshtastic_ModuleConfig_AmbientLightingConfig_init_default, false, meshtastic_ModuleConfig_DetectionSensorConfig_init_default, false, meshtastic_ModuleConfig_PaxcounterConfig_init_default, false, meshtastic_ModuleConfig_StatusMessageConfig_init_default, false, meshtastic_ModuleConfig_TrafficManagementConfig_init_default, false, meshtastic_ModuleConfig_TAKConfig_init_default}
#define meshtastic_LocalModuleConfig_init_default {false, meshtastic_ModuleConfig_MQTTConfig_init_default, false, meshtastic_ModuleConfig_SerialConfig_init_default, false, meshtastic_ModuleConfig_ExternalNotificationConfig_init_default, false, meshtastic_ModuleConfig_StoreForwardConfig_init_default, false, meshtastic_ModuleConfig_RangeTestConfig_init_default, false, meshtastic_ModuleConfig_TelemetryConfig_init_default, false, meshtastic_ModuleConfig_CannedMessageConfig_init_default, 0, false, meshtastic_ModuleConfig_AudioConfig_init_default, false, meshtastic_ModuleConfig_RemoteHardwareConfig_init_default, false, meshtastic_ModuleConfig_NeighborInfoConfig_init_default, false, meshtastic_ModuleConfig_AmbientLightingConfig_init_default, false, meshtastic_ModuleConfig_DetectionSensorConfig_init_default, false, meshtastic_ModuleConfig_PaxcounterConfig_init_default, false, meshtastic_ModuleConfig_StatusMessageConfig_init_default, false, meshtastic_ModuleConfig_TrafficManagementConfig_init_default, false, meshtastic_ModuleConfig_TAKConfig_init_default, false, meshtastic_ModuleConfig_MeshBeaconConfig_init_default}
#define meshtastic_LocalConfig_init_zero {false, meshtastic_Config_DeviceConfig_init_zero, false, meshtastic_Config_PositionConfig_init_zero, false, meshtastic_Config_PowerConfig_init_zero, false, meshtastic_Config_NetworkConfig_init_zero, false, meshtastic_Config_DisplayConfig_init_zero, false, meshtastic_Config_LoRaConfig_init_zero, false, meshtastic_Config_BluetoothConfig_init_zero, 0, false, meshtastic_Config_SecurityConfig_init_zero}
#define meshtastic_LocalModuleConfig_init_zero {false, meshtastic_ModuleConfig_MQTTConfig_init_zero, false, meshtastic_ModuleConfig_SerialConfig_init_zero, false, meshtastic_ModuleConfig_ExternalNotificationConfig_init_zero, false, meshtastic_ModuleConfig_StoreForwardConfig_init_zero, false, meshtastic_ModuleConfig_RangeTestConfig_init_zero, false, meshtastic_ModuleConfig_TelemetryConfig_init_zero, false, meshtastic_ModuleConfig_CannedMessageConfig_init_zero, 0, false, meshtastic_ModuleConfig_AudioConfig_init_zero, false, meshtastic_ModuleConfig_RemoteHardwareConfig_init_zero, false, meshtastic_ModuleConfig_NeighborInfoConfig_init_zero, false, meshtastic_ModuleConfig_AmbientLightingConfig_init_zero, false, meshtastic_ModuleConfig_DetectionSensorConfig_init_zero, false, meshtastic_ModuleConfig_PaxcounterConfig_init_zero, false, meshtastic_ModuleConfig_StatusMessageConfig_init_zero, false, meshtastic_ModuleConfig_TrafficManagementConfig_init_zero, false, meshtastic_ModuleConfig_TAKConfig_init_zero}
#define meshtastic_LocalModuleConfig_init_zero {false, meshtastic_ModuleConfig_MQTTConfig_init_zero, false, meshtastic_ModuleConfig_SerialConfig_init_zero, false, meshtastic_ModuleConfig_ExternalNotificationConfig_init_zero, false, meshtastic_ModuleConfig_StoreForwardConfig_init_zero, false, meshtastic_ModuleConfig_RangeTestConfig_init_zero, false, meshtastic_ModuleConfig_TelemetryConfig_init_zero, false, meshtastic_ModuleConfig_CannedMessageConfig_init_zero, 0, false, meshtastic_ModuleConfig_AudioConfig_init_zero, false, meshtastic_ModuleConfig_RemoteHardwareConfig_init_zero, false, meshtastic_ModuleConfig_NeighborInfoConfig_init_zero, false, meshtastic_ModuleConfig_AmbientLightingConfig_init_zero, false, meshtastic_ModuleConfig_DetectionSensorConfig_init_zero, false, meshtastic_ModuleConfig_PaxcounterConfig_init_zero, false, meshtastic_ModuleConfig_StatusMessageConfig_init_zero, false, meshtastic_ModuleConfig_TrafficManagementConfig_init_zero, false, meshtastic_ModuleConfig_TAKConfig_init_zero, false, meshtastic_ModuleConfig_MeshBeaconConfig_init_zero}

/* Field tags (for use in manual encoding/decoding) */
#define meshtastic_LocalConfig_device_tag 1
Expand Down Expand Up @@ -136,6 +139,7 @@ extern "C" {
#define meshtastic_LocalModuleConfig_statusmessage_tag 15
#define meshtastic_LocalModuleConfig_traffic_management_tag 16
#define meshtastic_LocalModuleConfig_tak_tag 17
#define meshtastic_LocalModuleConfig_mesh_beacon_tag 18

/* Struct field encoding specification for nanopb */
#define meshtastic_LocalConfig_FIELDLIST(X, a) \
Expand Down Expand Up @@ -176,7 +180,8 @@ X(a, STATIC, OPTIONAL, MESSAGE, detection_sensor, 13) \
X(a, STATIC, OPTIONAL, MESSAGE, paxcounter, 14) \
X(a, STATIC, OPTIONAL, MESSAGE, statusmessage, 15) \
X(a, STATIC, OPTIONAL, MESSAGE, traffic_management, 16) \
X(a, STATIC, OPTIONAL, MESSAGE, tak, 17)
X(a, STATIC, OPTIONAL, MESSAGE, tak, 17) \
X(a, STATIC, OPTIONAL, MESSAGE, mesh_beacon, 18)
#define meshtastic_LocalModuleConfig_CALLBACK NULL
#define meshtastic_LocalModuleConfig_DEFAULT NULL
#define meshtastic_LocalModuleConfig_mqtt_MSGTYPE meshtastic_ModuleConfig_MQTTConfig
Expand All @@ -195,6 +200,7 @@ X(a, STATIC, OPTIONAL, MESSAGE, tak, 17)
#define meshtastic_LocalModuleConfig_statusmessage_MSGTYPE meshtastic_ModuleConfig_StatusMessageConfig
#define meshtastic_LocalModuleConfig_traffic_management_MSGTYPE meshtastic_ModuleConfig_TrafficManagementConfig
#define meshtastic_LocalModuleConfig_tak_MSGTYPE meshtastic_ModuleConfig_TAKConfig
#define meshtastic_LocalModuleConfig_mesh_beacon_MSGTYPE meshtastic_ModuleConfig_MeshBeaconConfig

extern const pb_msgdesc_t meshtastic_LocalConfig_msg;
extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
Expand All @@ -206,7 +212,7 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalModuleConfig_size
#define meshtastic_LocalConfig_size 757
#define meshtastic_LocalModuleConfig_size 820
#define meshtastic_LocalModuleConfig_size 1100

#ifdef __cplusplus
} /* extern "C" */
Expand Down
12 changes: 12 additions & 0 deletions src/mesh/generated/meshtastic/mesh_beacon.pb.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* Automatically generated nanopb constant definitions */
/* Generated by nanopb-0.4.9.1 */

#include "meshtastic/mesh_beacon.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif

PB_BIND(meshtastic_MeshBeacon, meshtastic_MeshBeacon, AUTO)



72 changes: 72 additions & 0 deletions src/mesh/generated/meshtastic/mesh_beacon.pb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/* Automatically generated nanopb header */
/* Generated by nanopb-0.4.9.1 */

#ifndef PB_MESHTASTIC_MESHTASTIC_MESH_BEACON_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_MESH_BEACON_PB_H_INCLUDED
#include <pb.h>
#include "meshtastic/channel.pb.h"
#include "meshtastic/config.pb.h"

#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
#endif

/* Struct definitions */
/* Payload for MESH_BEACON_APP packets.
Periodically broadcast by nodes in beacon mode.
Listeners deliver the text message to the local inbox and cache any offered
channel/preset for the client app to act on — the firmware never auto-applies them. */
typedef struct _meshtastic_MeshBeacon {
/* Human-readable beacon message. Max 100 bytes enforced by firmware on send. */
char message[101];
/* Optional channel (name + PSK) being advertised to listening clients.
A client app may offer to switch the user to this channel; firmware never applies it automatically. */
bool has_offer_channel;
meshtastic_ChannelSettings offer_channel;
/* Optional region being advertised alongside offer_preset. */
meshtastic_Config_LoRaConfig_RegionCode offer_region;
/* Optional modem preset being advertised.
Combined with offer_region, tells a client "there is a mesh on this preset/region". */
bool has_offer_preset;
meshtastic_Config_LoRaConfig_ModemPreset offer_preset;
} meshtastic_MeshBeacon;


#ifdef __cplusplus
extern "C" {
#endif

/* Initializer values for message structs */
#define meshtastic_MeshBeacon_init_default {"", false, meshtastic_ChannelSettings_init_default, _meshtastic_Config_LoRaConfig_RegionCode_MIN, false, _meshtastic_Config_LoRaConfig_ModemPreset_MIN}
#define meshtastic_MeshBeacon_init_zero {"", false, meshtastic_ChannelSettings_init_zero, _meshtastic_Config_LoRaConfig_RegionCode_MIN, false, _meshtastic_Config_LoRaConfig_ModemPreset_MIN}

/* Field tags (for use in manual encoding/decoding) */
#define meshtastic_MeshBeacon_message_tag 1
#define meshtastic_MeshBeacon_offer_channel_tag 2
#define meshtastic_MeshBeacon_offer_region_tag 3
#define meshtastic_MeshBeacon_offer_preset_tag 4

/* Struct field encoding specification for nanopb */
#define meshtastic_MeshBeacon_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, STRING, message, 1) \
X(a, STATIC, OPTIONAL, MESSAGE, offer_channel, 2) \
X(a, STATIC, SINGULAR, UENUM, offer_region, 3) \
X(a, STATIC, OPTIONAL, UENUM, offer_preset, 4)
#define meshtastic_MeshBeacon_CALLBACK NULL
#define meshtastic_MeshBeacon_DEFAULT NULL
#define meshtastic_MeshBeacon_offer_channel_MSGTYPE meshtastic_ChannelSettings

extern const pb_msgdesc_t meshtastic_MeshBeacon_msg;

/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
#define meshtastic_MeshBeacon_fields &meshtastic_MeshBeacon_msg

/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_MESH_BEACON_PB_H_MAX_SIZE meshtastic_MeshBeacon_size
#define meshtastic_MeshBeacon_size 180

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
Loading
Loading