diff --git a/src/mesh/Default.h b/src/mesh/Default.h index a60e3af9b..e206d8277 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -13,7 +13,10 @@ #define min_default_telemetry_interval_secs 30 * 60 #define default_gps_update_interval IF_ROUTER(ONE_DAY, 2 * 60) #define default_telemetry_broadcast_interval_secs IF_ROUTER(ONE_DAY / 2, 60 * 60) -#define default_broadcast_interval_secs IF_ROUTER(ONE_DAY / 2, 15 * 60) +#define default_broadcast_interval_secs IF_ROUTER(ONE_DAY / 2, 60 * 60) +#define default_broadcast_smart_minimum_interval_secs 5 * 60 +#define min_default_broadcast_interval_secs 60 * 60 +#define min_default_broadcast_smart_minimum_interval_secs 5 * 60 #define default_wait_bluetooth_secs IF_ROUTER(1, 60) #define default_sds_secs IF_ROUTER(ONE_DAY, UINT32_MAX) // Default to forever super deep sleep #define default_ls_secs IF_ROUTER(ONE_DAY, 5 * 60) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 3c408f01f..8913e0019 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -335,6 +335,23 @@ NodeDB::NodeDB() moduleConfig.telemetry.health_update_interval = Default::getConfiguredOrMinimumValue( moduleConfig.telemetry.health_update_interval, min_default_telemetry_interval_secs); } + // Enforce position broadcast minimums if we would send positions over a default channel + // Check channels the same way PositionModule::sendOurPosition() does - first channel with position_precision set + bool positionUsesDefaultChannel = false; + for (uint8_t i = 0; i < channels.getNumChannels(); i++) { + if (channels.getByIndex(i).settings.has_module_settings && + channels.getByIndex(i).settings.module_settings.position_precision != 0) { + positionUsesDefaultChannel = channels.isDefaultChannel(i); + break; + } + } + if (positionUsesDefaultChannel) { + LOG_DEBUG("Coerce position broadcasts to min of 1 hour and smart broadcast min of 5 minutes on defaults"); + config.position.position_broadcast_secs = + Default::getConfiguredOrMinimumValue(config.position.position_broadcast_secs, min_default_broadcast_interval_secs); + config.position.broadcast_smart_minimum_interval_secs = Default::getConfiguredOrMinimumValue( + config.position.broadcast_smart_minimum_interval_secs, min_default_broadcast_smart_minimum_interval_secs); + } // FIXME: UINT32_MAX intervals overflows Apple clients until they are fully patched if (config.device.node_info_broadcast_secs > MAX_INTERVAL) config.device.node_info_broadcast_secs = MAX_INTERVAL; @@ -644,7 +661,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) config.position.position_broadcast_smart_enabled = true; #endif config.position.broadcast_smart_minimum_distance = 100; - config.position.broadcast_smart_minimum_interval_secs = 30; + config.position.broadcast_smart_minimum_interval_secs = default_broadcast_smart_minimum_interval_secs; if (config.device.role != meshtastic_Config_DeviceConfig_Role_ROUTER) config.device.node_info_broadcast_secs = default_node_info_broadcast_secs; config.security.serial_enabled = true; diff --git a/src/modules/PositionModule.h b/src/modules/PositionModule.h index 32e499531..d0a4d4603 100644 --- a/src/modules/PositionModule.h +++ b/src/modules/PositionModule.h @@ -69,10 +69,11 @@ class PositionModule : public ProtobufModule, private concu // In event mode we want to prevent excessive position broadcasts // we set the minimum interval to 5m const uint32_t minimumTimeThreshold = - max(uint32_t(300000), Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, 30)); + max(uint32_t(300000), Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, + default_broadcast_smart_minimum_interval_secs)); #else - const uint32_t minimumTimeThreshold = - Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, 30); + const uint32_t minimumTimeThreshold = Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, + default_broadcast_smart_minimum_interval_secs); #endif };