Merge branch 'main' into rx_delay
# Conflicts: # examples/simple_repeater/main.cpp # examples/simple_room_server/main.cpp
This commit is contained in:
@@ -42,6 +42,10 @@
|
|||||||
#define MAX_CONTACTS 100
|
#define MAX_CONTACTS 100
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef OFFLINE_QUEUE_SIZE
|
||||||
|
#define OFFLINE_QUEUE_SIZE 16
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <helpers/BaseChatMesh.h>
|
#include <helpers/BaseChatMesh.h>
|
||||||
|
|
||||||
#define SEND_TIMEOUT_BASE_MILLIS 300
|
#define SEND_TIMEOUT_BASE_MILLIS 300
|
||||||
@@ -143,6 +147,13 @@ class MyMesh : public BaseChatMesh {
|
|||||||
uint8_t cmd_frame[MAX_FRAME_SIZE+1];
|
uint8_t cmd_frame[MAX_FRAME_SIZE+1];
|
||||||
uint8_t out_frame[MAX_FRAME_SIZE+1];
|
uint8_t out_frame[MAX_FRAME_SIZE+1];
|
||||||
|
|
||||||
|
struct Frame {
|
||||||
|
uint8_t len;
|
||||||
|
uint8_t buf[MAX_FRAME_SIZE];
|
||||||
|
};
|
||||||
|
int offline_queue_len;
|
||||||
|
Frame offline_queue[OFFLINE_QUEUE_SIZE];
|
||||||
|
|
||||||
void loadContacts() {
|
void loadContacts() {
|
||||||
if (_fs->exists("/contacts3")) {
|
if (_fs->exists("/contacts3")) {
|
||||||
File file = _fs->open("/contacts3");
|
File file = _fs->open("/contacts3");
|
||||||
@@ -254,9 +265,25 @@ class MyMesh : public BaseChatMesh {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void addToOfflineQueue(const uint8_t frame[], int len) {
|
void addToOfflineQueue(const uint8_t frame[], int len) {
|
||||||
// TODO
|
if (offline_queue_len >= OFFLINE_QUEUE_SIZE) {
|
||||||
|
MESH_DEBUG_PRINTLN("ERROR: offline_queue is full!");
|
||||||
|
} else {
|
||||||
|
offline_queue[offline_queue_len].len = len;
|
||||||
|
memcpy(offline_queue[offline_queue_len].buf, frame, len);
|
||||||
|
offline_queue_len++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int getFromOfflineQueue(uint8_t frame[]) {
|
int getFromOfflineQueue(uint8_t frame[]) {
|
||||||
|
if (offline_queue_len > 0) { // check offline queue
|
||||||
|
size_t len = offline_queue[0].len; // take from top of queue
|
||||||
|
memcpy(frame, offline_queue[0].buf, len);
|
||||||
|
|
||||||
|
offline_queue_len--;
|
||||||
|
for (int i = 0; i < offline_queue_len; i++) { // delete top item from queue
|
||||||
|
offline_queue[i] = offline_queue[i + 1];
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
return 0; // queue is empty
|
return 0; // queue is empty
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,6 +391,7 @@ public:
|
|||||||
: BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL)
|
: BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL)
|
||||||
{
|
{
|
||||||
_iter_started = false;
|
_iter_started = false;
|
||||||
|
offline_queue_len = 0;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
|
|||||||
@@ -120,7 +120,8 @@ struct NodePrefs { // persisted to file
|
|||||||
char password[16];
|
char password[16];
|
||||||
float freq;
|
float freq;
|
||||||
uint8_t tx_power_dbm;
|
uint8_t tx_power_dbm;
|
||||||
uint8_t unused[3];
|
uint8_t disable_fwd;
|
||||||
|
uint8_t unused[2];
|
||||||
float rx_delay_base;
|
float rx_delay_base;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -191,7 +192,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool allowPacketForward(const mesh::Packet* packet) override {
|
bool allowPacketForward(const mesh::Packet* packet) override {
|
||||||
return true; // Yes, allow packet to be forwarded
|
return !_prefs.disable_fwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int calcRxDelay(float score, uint32_t air_time) const override {
|
int calcRxDelay(float score, uint32_t air_time) const override {
|
||||||
@@ -375,6 +376,7 @@ public:
|
|||||||
num_clients = 0;
|
num_clients = 0;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0; // one half
|
||||||
_prefs.rx_delay_base = 10.0;
|
_prefs.rx_delay_base = 10.0;
|
||||||
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
|
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
|
||||||
@@ -385,7 +387,6 @@ public:
|
|||||||
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
|
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
|
||||||
_prefs.freq = LORA_FREQ;
|
_prefs.freq = LORA_FREQ;
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
memset(_prefs.unused, 0, sizeof(_prefs.unused));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float getFreqPref() const { return _prefs.freq; }
|
float getFreqPref() const { return _prefs.freq; }
|
||||||
@@ -485,6 +486,10 @@ public:
|
|||||||
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
|
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
|
||||||
savePrefs();
|
savePrefs();
|
||||||
strcpy(reply, "OK");
|
strcpy(reply, "OK");
|
||||||
|
} else if (memcmp(config, "repeat ", 7) == 0) {
|
||||||
|
_prefs.disable_fwd = memcmp(&config[7], "off", 3) == 0;
|
||||||
|
savePrefs();
|
||||||
|
strcpy(reply, _prefs.disable_fwd ? "OK - repeat is now OFF" : "OK - repeat is now ON");
|
||||||
} else if (memcmp(config, "lat ", 4) == 0) {
|
} else if (memcmp(config, "lat ", 4) == 0) {
|
||||||
_prefs.node_lat = atof(&config[4]);
|
_prefs.node_lat = atof(&config[4]);
|
||||||
savePrefs();
|
savePrefs();
|
||||||
|
|||||||
@@ -137,7 +137,8 @@ struct NodePrefs { // persisted to file
|
|||||||
char password[16];
|
char password[16];
|
||||||
float freq;
|
float freq;
|
||||||
uint8_t tx_power_dbm;
|
uint8_t tx_power_dbm;
|
||||||
uint8_t unused[3];
|
uint8_t disable_fwd;
|
||||||
|
uint8_t unused[2];
|
||||||
float rx_delay_base;
|
float rx_delay_base;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -252,11 +253,9 @@ protected:
|
|||||||
return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time);
|
return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ROOM_IS_ALSO_REPEATER
|
|
||||||
bool allowPacketForward(const mesh::Packet* packet) override {
|
bool allowPacketForward(const mesh::Packet* packet) override {
|
||||||
return true; // Yes, allow packet to be forwarded
|
return !_prefs.disable_fwd;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void onAnonDataRecv(mesh::Packet* packet, uint8_t type, const mesh::Identity& sender, uint8_t* data, size_t len) override {
|
void onAnonDataRecv(mesh::Packet* packet, uint8_t type, const mesh::Identity& sender, uint8_t* data, size_t len) override {
|
||||||
if (type == PAYLOAD_TYPE_ANON_REQ) { // received an initial request by a possible admin client (unknown at this stage)
|
if (type == PAYLOAD_TYPE_ANON_REQ) { // received an initial request by a possible admin client (unknown at this stage)
|
||||||
@@ -489,6 +488,7 @@ public:
|
|||||||
my_radio = &radio;
|
my_radio = &radio;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
_prefs.airtime_factor = 1.0; // one half
|
_prefs.airtime_factor = 1.0; // one half
|
||||||
_prefs.rx_delay_base = 10.0;
|
_prefs.rx_delay_base = 10.0;
|
||||||
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
|
strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1);
|
||||||
@@ -499,7 +499,7 @@ public:
|
|||||||
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
|
_prefs.password[sizeof(_prefs.password)-1] = 0; // truncate if necessary
|
||||||
_prefs.freq = LORA_FREQ;
|
_prefs.freq = LORA_FREQ;
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_prefs.tx_power_dbm = LORA_TX_POWER;
|
||||||
memset(_prefs.unused, 0, sizeof(_prefs.unused));
|
_prefs.disable_fwd = 1;
|
||||||
|
|
||||||
num_clients = 0;
|
num_clients = 0;
|
||||||
next_post_idx = 0;
|
next_post_idx = 0;
|
||||||
@@ -605,6 +605,10 @@ public:
|
|||||||
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
|
_prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec
|
||||||
savePrefs();
|
savePrefs();
|
||||||
strcpy(reply, "OK");
|
strcpy(reply, "OK");
|
||||||
|
} else if (memcmp(config, "repeat ", 7) == 0) {
|
||||||
|
_prefs.disable_fwd = memcmp(&config[7], "off", 3) == 0;
|
||||||
|
savePrefs();
|
||||||
|
strcpy(reply, _prefs.disable_fwd ? "OK - repeat is now OFF" : "OK - repeat is now ON");
|
||||||
} else if (memcmp(config, "lat ", 4) == 0) {
|
} else if (memcmp(config, "lat ", 4) == 0) {
|
||||||
_prefs.node_lat = atof(&config[4]);
|
_prefs.node_lat = atof(&config[4]);
|
||||||
savePrefs();
|
savePrefs();
|
||||||
|
|||||||
Reference in New Issue
Block a user