mirror of
https://github.com/alexhopeoconnor/firmware.git
synced 2026-10-18 17:31:42 +10:00
* Add ESP32 Power Management lessons learned document Documents our experimentation with ESP-IDF DFS and why it doesn't work well for Meshtastic (RTOS locks, BLE locks, USB issues). Proposes simpler alternative: manual setCpuFrequencyMhz() control with explicit triggers for when to go fast vs slow. * Addition of traffic management module * Fixing compile issues, but may still need to update protobufs. * Fixing log2Floor in cuckoo hash function * Adding support for traffic management in PhoneAPI. * Making router_preserve_hops work without checking if the previous hop was a router. Also works for CLIENT_BASE. * Adding station-g2 and portduino varients to be able to use this module. * Spoofing from address for nodeinfo cache * Changing name and behavior for zero_hop_telemetry / zero_hop_position * Name change for exhausting telemetry packets and setting hop_limit to 1 so it will be 0 when sent. * Updated hop logic, including exhaustRequested flag to bypass some checks later in the code. * Reducing memory on nrf52 nodes further to 12 bytes per entry, 12KB total using 8 bit hashes with 0.4% collision. Probably ok. Adding portduino to the platforms that don't need to worry about memory as much. * Fixing hopsAway for nodeinfo responses. * traffic_management.nodeinfo_direct_response_min_hops -> traffic_management.nodeinfo_direct_response_max_hops * Removing dry run mode * Updates to UnifiedCacheEntry to use a common cache, created defaults for some values, reduced a couple bytes per entry by using a resolution-scale time selection based on configuration value. * Enhance traffic management logging and configuration. Updated log messages in NextHopRouter and Router to include more context. Adjusted traffic management configuration checks in AdminModule and improved cache handling in TrafficManagementModule. Ensured consistent enabling of traffic management across various variants. * Implement destructor for TrafficManagementModule and improve cache allocation handling. The destructor ensures proper deallocation of cache memory based on its allocation source (PSRAM or heap). Additionally, updated cache allocation logic to log warnings only when PSRAM allocation fails. * Update TrafficManagementModule with enhanced comments for clarity and improve cache handling logic. Update protobuf submodule to latest commit. * Creating consistent log messages * Remove docs/ESP32_Power_Management.md from traffic_module * Add unit tests for Traffic Management Module functionality * Fixing compile issues, but may still need to update protobufs. * Adding support for traffic management in PhoneAPI. * Making router_preserve_hops work without checking if the previous hop was a router. Also works for CLIENT_BASE. * Enhance traffic management logging and configuration. Updated log messages in NextHopRouter and Router to include more context. Adjusted traffic management configuration checks in AdminModule and improved cache handling in TrafficManagementModule. Ensured consistent enabling of traffic management across various variants. * Implement destructor for TrafficManagementModule and improve cache allocation handling. The destructor ensures proper deallocation of cache memory based on its allocation source (PSRAM or heap). Additionally, updated cache allocation logic to log warnings only when PSRAM allocation fails. * Update TrafficManagementModule with enhanced comments for clarity and improve cache handling logic. Update protobuf submodule to latest commit. * Add mock classes and unit tests for Traffic Management Module functionality. * Refactor setup and loop functions in test_main.cpp to include extern "C" linkage * Update comment to include reduced memory requirements Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Re-arranging comments for programmers with the attention span of less than 5 lines of code. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update comments in TrafficManagementModule to reflect changes in timestamp epoch handling and memory optimization details. * bug: Use node-wide config_ok_to_mqtt setting for cached NodeInfo replies. * Better way to handle clearing the ok_to_mqtt bit * Add bucketing to cuckoo hashing, allowing for 95% occupied rate before major eviction problems. * Extend nodeinfo cache for psram devices. * Refactor traffic management to make hop exhaustion packet-scoped. Nice catch. * Implement better position precision sanitization in TrafficManagementModule. * Added logic in TrafficManagementModule to invalidate stale traffic state. Also, added some tests to avoid future me from creating a regression here. * Fixing tests for native * Enhance TrafficManagementModule to improve NodeInfo response handling and position deduplication logic. Added tests to ensure local packets bypass transit filters and that NodeInfo requests correctly update the requester information in the cache. Updated deduplication checks to prevent dropping valid position packets under certain conditions. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
112 lines
5.3 KiB
C++
112 lines
5.3 KiB
C++
#pragma once
|
|
#include <MeshRadio.h>
|
|
#include <NodeDB.h>
|
|
#include <RadioInterface.h>
|
|
#include <cmath>
|
|
#include <cstdint>
|
|
#include <meshUtils.h>
|
|
#define ONE_DAY 24 * 60 * 60
|
|
#define ONE_MINUTE_MS 60 * 1000
|
|
#define THIRTY_SECONDS_MS 30 * 1000
|
|
#define TWO_SECONDS_MS 2 * 1000
|
|
#define FIVE_SECONDS_MS 5 * 1000
|
|
#define TEN_SECONDS_MS 10 * 1000
|
|
#define MAX_INTERVAL INT32_MAX // FIXME: INT32_MAX to avoid overflow issues with Apple clients but should be UINT32_MAX
|
|
|
|
#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, 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)
|
|
#define default_min_wake_secs 10
|
|
#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 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
|
|
|
|
// Traffic management defaults
|
|
#define default_traffic_mgmt_position_precision_bits 24 // ~10m grid cells
|
|
#define default_traffic_mgmt_position_min_interval_secs ONE_DAY // 1 day between identical positions
|
|
|
|
#ifdef USERPREFS_RINGTONE_NAG_SECS
|
|
#define default_ringtone_nag_secs USERPREFS_RINGTONE_NAG_SECS
|
|
#else
|
|
#define default_ringtone_nag_secs 15
|
|
#endif
|
|
#define default_network_ipv6_enabled false
|
|
|
|
#define default_mqtt_address "mqtt.meshtastic.org"
|
|
#define default_mqtt_username "meshdev"
|
|
#define default_mqtt_password "large4cats"
|
|
#define default_mqtt_root "msh"
|
|
#define default_mqtt_encryption_enabled true
|
|
#define default_mqtt_tls_enabled false
|
|
|
|
#define IF_ROUTER(routerVal, normalVal) \
|
|
((config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER || \
|
|
config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER_LATE) \
|
|
? (routerVal) \
|
|
: (normalVal))
|
|
|
|
class Default
|
|
{
|
|
public:
|
|
static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval);
|
|
static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval, uint32_t defaultInterval);
|
|
static uint32_t getConfiguredOrDefault(uint32_t configured, uint32_t defaultValue);
|
|
// Note: numOnlineNodes uses uint32_t to match the public API and allow flexibility,
|
|
// even though internal node counts use uint16_t (max 65535 nodes)
|
|
static uint32_t getConfiguredOrDefaultMsScaled(uint32_t configured, uint32_t defaultValue, uint32_t numOnlineNodes);
|
|
static uint8_t getConfiguredOrDefaultHopLimit(uint8_t configured);
|
|
static uint32_t getConfiguredOrMinimumValue(uint32_t configured, uint32_t minValue);
|
|
|
|
private:
|
|
// Note: Kept as uint32_t to match the public API parameter type
|
|
static float congestionScalingCoefficient(uint32_t numOnlineNodes)
|
|
{
|
|
if (numOnlineNodes <= 40) {
|
|
return 1.0;
|
|
} else {
|
|
// Resolve SF and BW from preset or manual config
|
|
// When use_preset is true, config.lora.spread_factor and bandwidth may be 0
|
|
// because applyModemConfig() sets them on RadioInterface, not on config.lora
|
|
float bwKHz;
|
|
uint8_t sf;
|
|
uint8_t cr;
|
|
if (config.lora.use_preset) {
|
|
modemPresetToParams(config.lora.modem_preset, false, bwKHz, sf, cr);
|
|
} else {
|
|
sf = config.lora.spread_factor;
|
|
bwKHz = bwCodeToKHz(config.lora.bandwidth);
|
|
}
|
|
|
|
// Guard against invalid values
|
|
sf = clampSpreadFactor(sf);
|
|
bwKHz = clampBandwidthKHz(bwKHz);
|
|
|
|
// throttlingFactor = 2^SF / (BW_in_kHz * scaling_divisor)
|
|
// With scaling_divisor=100:
|
|
// In SF11 and BW=250khz (longfast), this gives 0.08192 rather than the original 0.075
|
|
// In SF10 and BW=250khz (mediumslow), this gives 0.04096 rather than the original 0.04
|
|
// In SF9 and BW=250khz (mediumfast), this gives 0.02048 rather than the original 0.02
|
|
// In SF7 and BW=250khz (shortfast), this gives 0.00512 rather than the original 0.01
|
|
float throttlingFactor = static_cast<float>(pow_of_2(sf)) / (bwKHz * 100.0f);
|
|
|
|
#if USERPREFS_EVENT_MODE
|
|
// If we are in event mode, scale down the throttling factor by 4
|
|
throttlingFactor = static_cast<float>(pow_of_2(sf)) / (bwKHz * 25.0f);
|
|
#endif
|
|
|
|
// Scaling up traffic based on number of nodes over 40
|
|
int nodesOverForty = (numOnlineNodes - 40);
|
|
return 1.0 + (nodesOverForty * throttlingFactor); // Each number of online node scales by throttle factor
|
|
}
|
|
}
|
|
}; |