diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index f3467a8a..c24227df 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -112,7 +112,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { FILESYSTEM* _fs; RADIO_CLASS* _phy; mesh::MainBoard* _board; - unsigned long next_local_advert; + unsigned long next_local_advert, next_flood_advert; bool _logging; NodePrefs _prefs; CommonCLI _cli; @@ -480,7 +480,7 @@ public: { my_radio = &radio; memset(known_clients, 0, sizeof(known_clients)); - next_local_advert = 0; + next_local_advert = next_flood_advert = 0; _logging = false; // defaults @@ -498,6 +498,7 @@ public: _prefs.cr = LORA_CR; _prefs.tx_power_dbm = LORA_TX_POWER; _prefs.advert_interval = 1; // default to 2 minutes for NEW installs + _prefs.flood_advert_interval = 3; // 3 hours _prefs.flood_max = 64; } @@ -516,6 +517,7 @@ public: _phy->setOutputPower(_prefs.tx_power_dbm); updateAdvertTimer(); + updateFloodAdvertTimer(); } const char* getFirmwareVer() override { return FIRMWARE_VERSION; } @@ -548,11 +550,18 @@ public: void updateAdvertTimer() override { if (_prefs.advert_interval > 0) { // schedule local advert timer - next_local_advert = futureMillis((uint32_t)_prefs.advert_interval * 2 * 60 * 1000); + next_local_advert = futureMillis( ((uint32_t)_prefs.advert_interval) * 2 * 60 * 1000); } else { next_local_advert = 0; // stop the timer } } + void updateFloodAdvertTimer() override { + if (_prefs.flood_advert_interval > 0) { // schedule flood advert timer + next_flood_advert = futureMillis( ((uint32_t)_prefs.flood_advert_interval) * 60 * 60 * 1000); + } else { + next_flood_advert = 0; // stop the timer + } + } void setLoggingOn(bool enable) override { _logging = enable; } @@ -579,11 +588,15 @@ public: void loop() { mesh::Mesh::loop(); - if (next_local_advert && millisHasNowPassed(next_local_advert)) { + if (next_flood_advert && millisHasNowPassed(next_flood_advert)) { mesh::Packet* pkt = createSelfAdvert(); - if (pkt) { - sendZeroHop(pkt); - } + if (pkt) sendFlood(pkt); + + updateFloodAdvertTimer(); // schedule next flood advert + updateAdvertTimer(); // also schedule local advert (so they don't overlap) + } else if (next_local_advert && millisHasNowPassed(next_local_advert)) { + mesh::Packet* pkt = createSelfAdvert(); + if (pkt) sendZeroHop(pkt); updateAdvertTimer(); // schedule next local advert } @@ -657,7 +670,7 @@ void setup() { #endif // send out initial Advertisement to the mesh - the_mesh.sendSelfAdvertisement(2000); + the_mesh.sendSelfAdvertisement(16000); } void loop() { diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 4cef1365..7aa495e1 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -139,7 +139,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { FILESYSTEM* _fs; RADIO_CLASS* _phy; mesh::MainBoard* _board; - unsigned long next_local_advert; + unsigned long next_local_advert, next_flood_advert; NodePrefs _prefs; CommonCLI _cli; uint8_t reply_data[MAX_PACKET_PAYLOAD]; @@ -584,7 +584,7 @@ public: _phy(&phy), _board(&board), _cli(board, this, &_prefs, this) { my_radio = &radio; - next_local_advert = 0; + next_local_advert = next_flood_advert = 0; // defaults memset(&_prefs, 0, sizeof(_prefs)); @@ -602,6 +602,7 @@ public: _prefs.tx_power_dbm = LORA_TX_POWER; _prefs.disable_fwd = 1; _prefs.advert_interval = 1; // default to 2 minutes for NEW installs + _prefs.flood_advert_interval = 3; // 3 hours _prefs.flood_max = 64; #ifdef ROOM_PASSWORD StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password)); @@ -667,6 +668,13 @@ public: next_local_advert = 0; // stop the timer } } + void updateFloodAdvertTimer() override { + if (_prefs.flood_advert_interval > 0) { // schedule flood advert timer + next_flood_advert = futureMillis( ((uint32_t)_prefs.flood_advert_interval) * 60 * 60 * 1000); + } else { + next_flood_advert = 0; // stop the timer + } + } void setLoggingOn(bool enable) override { /* no-op */ } void eraseLogFile() override { /* no-op */ } @@ -711,11 +719,15 @@ public: next_push = futureMillis(SYNC_PUSH_INTERVAL); } - if (next_local_advert && millisHasNowPassed(next_local_advert)) { + if (next_flood_advert && millisHasNowPassed(next_flood_advert)) { mesh::Packet* pkt = createSelfAdvert(); - if (pkt) { - sendZeroHop(pkt); - } + if (pkt) sendFlood(pkt); + + updateFloodAdvertTimer(); // schedule next flood advert + updateAdvertTimer(); // also schedule local advert (so they don't overlap) + } else if (next_local_advert && millisHasNowPassed(next_local_advert)) { + mesh::Packet* pkt = createSelfAdvert(); + if (pkt) sendZeroHop(pkt); updateAdvertTimer(); // schedule next local advert } @@ -791,7 +803,7 @@ void setup() { #endif // send out initial Advertisement to the mesh - the_mesh.sendSelfAdvertisement(2000); + the_mesh.sendSelfAdvertisement(16000); } void loop() { diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 457816a4..b9950dd1 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -29,7 +29,7 @@ void CommonCLI::loadPrefs(FILESYSTEM* fs) { file.read((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76 file.read((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77 file.read((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78 - file.read((uint8_t *) &_prefs->unused, sizeof(_prefs->unused)); // 79 + file.read((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 79 file.read((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80 file.read((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84 file.read((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88 @@ -80,7 +80,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76 file.write((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77 file.write((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78 - file.write((uint8_t *) &_prefs->unused, sizeof(_prefs->unused)); // 79 + file.write((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 79 file.write((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80 file.write((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84 file.write((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88 @@ -155,6 +155,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch const char* config = &command[4]; if (memcmp(config, "af", 2) == 0) { sprintf(reply, "> %s", StrHelper::ftoa(_prefs->airtime_factor)); + } else if (memcmp(config, "flood.advert.interval", 21) == 0) { + sprintf(reply, "> %d", ((uint32_t) _prefs->flood_advert_interval)); } else if (memcmp(config, "advert.interval", 15) == 0) { sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2); } else if (memcmp(config, "guest.password", 14) == 0) { @@ -193,6 +195,18 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch _prefs->airtime_factor = atof(&config[3]); savePrefs(); strcpy(reply, "OK"); + } else if (memcmp(config, "flood.advert.interval ", 22) == 0) { + int hours = _atoi(&config[22]); + if (hours > 0 && hours < 3) { + sprintf(reply, "Error: min is 3 hours"); + } else if (hours > 48) { + strcpy(reply, "Error: max is 48 hours"); + } else { + _prefs->flood_advert_interval = (uint8_t)(hours); + _callbacks->updateFloodAdvertTimer(); + savePrefs(); + strcpy(reply, "OK"); + } } else if (memcmp(config, "advert.interval ", 16) == 0) { int mins = _atoi(&config[16]); if (mins > 0 && mins < MIN_LOCAL_ADVERT_INTERVAL) { diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index 5538f339..309ee134 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -11,8 +11,8 @@ struct NodePrefs { // persisted to file float freq; uint8_t tx_power_dbm; uint8_t disable_fwd; - uint8_t advert_interval; // minutes - uint8_t unused; + uint8_t advert_interval; // minutes / 2 + uint8_t flood_advert_interval; // hours float rx_delay_base; float tx_delay_factor; char guest_password[16]; @@ -34,6 +34,7 @@ public: virtual bool formatFileSystem() = 0; virtual void sendSelfAdvertisement(int delay_millis) = 0; virtual void updateAdvertTimer() = 0; + virtual void updateFloodAdvertTimer() = 0; virtual void setLoggingOn(bool enable) = 0; virtual void eraseLogFile() = 0; virtual void dumpLogFile() = 0;