mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
* repeater & room server: new config "flood.advert.interval"
This commit is contained in:
parent
7010123619
commit
39a4476194
4 changed files with 59 additions and 19 deletions
|
|
@ -112,7 +112,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
|
||||||
FILESYSTEM* _fs;
|
FILESYSTEM* _fs;
|
||||||
RADIO_CLASS* _phy;
|
RADIO_CLASS* _phy;
|
||||||
mesh::MainBoard* _board;
|
mesh::MainBoard* _board;
|
||||||
unsigned long next_local_advert;
|
unsigned long next_local_advert, next_flood_advert;
|
||||||
bool _logging;
|
bool _logging;
|
||||||
NodePrefs _prefs;
|
NodePrefs _prefs;
|
||||||
CommonCLI _cli;
|
CommonCLI _cli;
|
||||||
|
|
@ -480,7 +480,7 @@ public:
|
||||||
{
|
{
|
||||||
my_radio = &radio;
|
my_radio = &radio;
|
||||||
memset(known_clients, 0, sizeof(known_clients));
|
memset(known_clients, 0, sizeof(known_clients));
|
||||||
next_local_advert = 0;
|
next_local_advert = next_flood_advert = 0;
|
||||||
_logging = false;
|
_logging = false;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
|
|
@ -498,6 +498,7 @@ public:
|
||||||
_prefs.cr = LORA_CR;
|
_prefs.cr = LORA_CR;
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
|
_prefs.flood_advert_interval = 3; // 3 hours
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -516,6 +517,7 @@ public:
|
||||||
_phy->setOutputPower(_prefs.tx_power_dbm);
|
_phy->setOutputPower(_prefs.tx_power_dbm);
|
||||||
|
|
||||||
updateAdvertTimer();
|
updateAdvertTimer();
|
||||||
|
updateFloodAdvertTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* getFirmwareVer() override { return FIRMWARE_VERSION; }
|
const char* getFirmwareVer() override { return FIRMWARE_VERSION; }
|
||||||
|
|
@ -548,11 +550,18 @@ public:
|
||||||
|
|
||||||
void updateAdvertTimer() override {
|
void updateAdvertTimer() override {
|
||||||
if (_prefs.advert_interval > 0) { // schedule local advert timer
|
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 {
|
} else {
|
||||||
next_local_advert = 0; // stop the timer
|
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; }
|
void setLoggingOn(bool enable) override { _logging = enable; }
|
||||||
|
|
||||||
|
|
@ -579,11 +588,15 @@ public:
|
||||||
void loop() {
|
void loop() {
|
||||||
mesh::Mesh::loop();
|
mesh::Mesh::loop();
|
||||||
|
|
||||||
if (next_local_advert && millisHasNowPassed(next_local_advert)) {
|
if (next_flood_advert && millisHasNowPassed(next_flood_advert)) {
|
||||||
mesh::Packet* pkt = createSelfAdvert();
|
mesh::Packet* pkt = createSelfAdvert();
|
||||||
if (pkt) {
|
if (pkt) sendFlood(pkt);
|
||||||
sendZeroHop(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
|
updateAdvertTimer(); // schedule next local advert
|
||||||
}
|
}
|
||||||
|
|
@ -657,7 +670,7 @@ void setup() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// send out initial Advertisement to the mesh
|
// send out initial Advertisement to the mesh
|
||||||
the_mesh.sendSelfAdvertisement(2000);
|
the_mesh.sendSelfAdvertisement(16000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
|
||||||
FILESYSTEM* _fs;
|
FILESYSTEM* _fs;
|
||||||
RADIO_CLASS* _phy;
|
RADIO_CLASS* _phy;
|
||||||
mesh::MainBoard* _board;
|
mesh::MainBoard* _board;
|
||||||
unsigned long next_local_advert;
|
unsigned long next_local_advert, next_flood_advert;
|
||||||
NodePrefs _prefs;
|
NodePrefs _prefs;
|
||||||
CommonCLI _cli;
|
CommonCLI _cli;
|
||||||
uint8_t reply_data[MAX_PACKET_PAYLOAD];
|
uint8_t reply_data[MAX_PACKET_PAYLOAD];
|
||||||
|
|
@ -584,7 +584,7 @@ public:
|
||||||
_phy(&phy), _board(&board), _cli(board, this, &_prefs, this)
|
_phy(&phy), _board(&board), _cli(board, this, &_prefs, this)
|
||||||
{
|
{
|
||||||
my_radio = &radio;
|
my_radio = &radio;
|
||||||
next_local_advert = 0;
|
next_local_advert = next_flood_advert = 0;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
|
|
@ -602,6 +602,7 @@ public:
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
_prefs.disable_fwd = 1;
|
_prefs.disable_fwd = 1;
|
||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
|
_prefs.flood_advert_interval = 3; // 3 hours
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
#ifdef ROOM_PASSWORD
|
#ifdef ROOM_PASSWORD
|
||||||
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
|
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
|
||||||
|
|
@ -667,6 +668,13 @@ public:
|
||||||
next_local_advert = 0; // stop the timer
|
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 setLoggingOn(bool enable) override { /* no-op */ }
|
||||||
void eraseLogFile() override { /* no-op */ }
|
void eraseLogFile() override { /* no-op */ }
|
||||||
|
|
@ -711,11 +719,15 @@ public:
|
||||||
next_push = futureMillis(SYNC_PUSH_INTERVAL);
|
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();
|
mesh::Packet* pkt = createSelfAdvert();
|
||||||
if (pkt) {
|
if (pkt) sendFlood(pkt);
|
||||||
sendZeroHop(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
|
updateAdvertTimer(); // schedule next local advert
|
||||||
}
|
}
|
||||||
|
|
@ -791,7 +803,7 @@ void setup() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// send out initial Advertisement to the mesh
|
// send out initial Advertisement to the mesh
|
||||||
the_mesh.sendSelfAdvertisement(2000);
|
the_mesh.sendSelfAdvertisement(16000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
|
||||||
|
|
@ -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->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->disable_fwd, sizeof(_prefs->disable_fwd)); // 77
|
||||||
file.read((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78
|
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->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->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84
|
||||||
file.read((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88
|
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->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->disable_fwd, sizeof(_prefs->disable_fwd)); // 77
|
||||||
file.write((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78
|
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->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->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84
|
||||||
file.write((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88
|
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];
|
const char* config = &command[4];
|
||||||
if (memcmp(config, "af", 2) == 0) {
|
if (memcmp(config, "af", 2) == 0) {
|
||||||
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->airtime_factor));
|
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) {
|
} else if (memcmp(config, "advert.interval", 15) == 0) {
|
||||||
sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2);
|
sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2);
|
||||||
} else if (memcmp(config, "guest.password", 14) == 0) {
|
} 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]);
|
_prefs->airtime_factor = atof(&config[3]);
|
||||||
savePrefs();
|
savePrefs();
|
||||||
strcpy(reply, "OK");
|
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) {
|
} else if (memcmp(config, "advert.interval ", 16) == 0) {
|
||||||
int mins = _atoi(&config[16]);
|
int mins = _atoi(&config[16]);
|
||||||
if (mins > 0 && mins < MIN_LOCAL_ADVERT_INTERVAL) {
|
if (mins > 0 && mins < MIN_LOCAL_ADVERT_INTERVAL) {
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ struct NodePrefs { // persisted to file
|
||||||
float freq;
|
float freq;
|
||||||
uint8_t tx_power_dbm;
|
uint8_t tx_power_dbm;
|
||||||
uint8_t disable_fwd;
|
uint8_t disable_fwd;
|
||||||
uint8_t advert_interval; // minutes
|
uint8_t advert_interval; // minutes / 2
|
||||||
uint8_t unused;
|
uint8_t flood_advert_interval; // hours
|
||||||
float rx_delay_base;
|
float rx_delay_base;
|
||||||
float tx_delay_factor;
|
float tx_delay_factor;
|
||||||
char guest_password[16];
|
char guest_password[16];
|
||||||
|
|
@ -34,6 +34,7 @@ public:
|
||||||
virtual bool formatFileSystem() = 0;
|
virtual bool formatFileSystem() = 0;
|
||||||
virtual void sendSelfAdvertisement(int delay_millis) = 0;
|
virtual void sendSelfAdvertisement(int delay_millis) = 0;
|
||||||
virtual void updateAdvertTimer() = 0;
|
virtual void updateAdvertTimer() = 0;
|
||||||
|
virtual void updateFloodAdvertTimer() = 0;
|
||||||
virtual void setLoggingOn(bool enable) = 0;
|
virtual void setLoggingOn(bool enable) = 0;
|
||||||
virtual void eraseLogFile() = 0;
|
virtual void eraseLogFile() = 0;
|
||||||
virtual void dumpLogFile() = 0;
|
virtual void dumpLogFile() = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue