diff --git a/docs/cli_commands.md b/docs/cli_commands.md index 8772b929fe..07073f9254 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -565,12 +565,14 @@ This document provides an overview of CLI commands that can be sent to MeshCore **Parameters:** - `value`: Duty cycle percentage (1-100) -**Default:** `50%` (equivalent to airtime factor 1.0) +**Default:** `10%` (equivalent to airtime factor 9.0), the ETSI EN 300 220-2 limit for the +869.4-869.65 MHz sub-band that the default frequency uses. Builds for regions without a duty +cycle limit can override this with the `MAX_DUTY_CYCLE` build flag. **Examples:** - `set dutycycle 100` — no duty cycle limit -- `set dutycycle 50` — 50% duty cycle (default) -- `set dutycycle 10` — 10% duty cycle +- `set dutycycle 50` — 50% duty cycle +- `set dutycycle 10` — 10% duty cycle (default) - `set dutycycle 1` — 1% duty cycle (strictest EU requirement) > **Note:** Added in firmware v1.15.0 diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index ee8114ca96..02e81aa4fb 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -943,7 +943,7 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe send_unscoped = false; // defaults - _prefs.airtime_factor = 1.0; + _prefs.airtime_factor = DEFAULT_AIRTIME_FACTOR; strcpy(_prefs.node_name, "NONAME"); _prefs.freq = LORA_FREQ; _prefs.sf = LORA_SF; diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index ca6a3e607e..b809a97015 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -887,7 +887,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc #endif // defaults - _prefs.airtime_factor = 1.0; + _prefs.airtime_factor = DEFAULT_AIRTIME_FACTOR; _prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0; _prefs.tx_delay_factor = 0.5f; // was 0.25f _prefs.direct_tx_delay_factor = 0.3f; // was 0.2 diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 71b8d32a3a..854b039a1d 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -644,7 +644,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc recv_pkt_region = NULL; // defaults - _prefs.airtime_factor = 1.0; + _prefs.airtime_factor = DEFAULT_AIRTIME_FACTOR; _prefs.rx_delay_base = 0.0f; // off by default, was 10.0 _prefs.tx_delay_factor = 0.5f; // was 0.25f; _prefs.direct_tx_delay_factor = 0.2f; // was zero diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 159249dfa5..f8172233e8 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -285,7 +285,7 @@ class MyMesh : public BaseChatMesh, ContactVisitor { { // defaults memset(&_prefs, 0, sizeof(_prefs)); - _prefs.airtime_factor = 1.0; + _prefs.airtime_factor = DEFAULT_AIRTIME_FACTOR; strcpy(_prefs.node_name, "NONAME"); _prefs.freq = LORA_FREQ; _prefs.tx_power_dbm = LORA_TX_POWER; diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 23d0cdc353..0bb444393e 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -710,7 +710,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise set_radio_at = revert_radio_at = 0; // defaults - _prefs.airtime_factor = 1.0; + _prefs.airtime_factor = DEFAULT_AIRTIME_FACTOR; _prefs.rx_delay_base = 0.0f; // turn off by default, was 10.0; _prefs.tx_delay_factor = 0.5f; // was 0.25f _prefs.direct_tx_delay_factor = 0.2f; // was zero diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index c0610b7f8a..8e008290b1 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -32,7 +32,7 @@ void Dispatcher::begin() { } float Dispatcher::getAirtimeBudgetFactor() const { - return 1.0; + return DEFAULT_AIRTIME_FACTOR; } void Dispatcher::updateTxBudget() { diff --git a/src/Dispatcher.h b/src/Dispatcher.h index aad6cba3ec..6810e066cc 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -6,6 +6,16 @@ #include #include +// Default transmit duty cycle limit, as a percentage of the duty cycle window. +// 10% is the ETSI EN 300 220-2 limit for the 869.4-869.65 MHz sub-band, which is where +// the default LORA_FREQ lives. Override per build for regions without a duty cycle limit. +#ifndef MAX_DUTY_CYCLE + #define MAX_DUTY_CYCLE 10 +#endif + +// Airtime budget factor equivalent of MAX_DUTY_CYCLE (see CommonCLI 'set dutycycle') +#define DEFAULT_AIRTIME_FACTOR ((100.0f / (MAX_DUTY_CYCLE)) - 1.0f) + namespace mesh { /**