diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 9fd80bfd..255a05c9 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -42,6 +42,10 @@ #define MAX_CONTACTS 100 #endif +#ifndef OFFLINE_QUEUE_SIZE + #define OFFLINE_QUEUE_SIZE 16 +#endif + #include #define SEND_TIMEOUT_BASE_MILLIS 300 @@ -143,6 +147,13 @@ class MyMesh : public BaseChatMesh { uint8_t cmd_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() { if (_fs->exists("/contacts3")) { File file = _fs->open("/contacts3"); @@ -254,9 +265,25 @@ class MyMesh : public BaseChatMesh { } 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[]) { + 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 } @@ -364,6 +391,7 @@ public: : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL) { _iter_started = false; + offline_queue_len = 0; // defaults memset(&_prefs, 0, sizeof(_prefs)); diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index c656301c..816417ac 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -120,7 +120,8 @@ struct NodePrefs { // persisted to file char password[16]; float freq; uint8_t tx_power_dbm; - uint8_t unused[3]; + uint8_t disable_fwd; + uint8_t unused[2]; float rx_delay_base; }; @@ -191,7 +192,7 @@ protected: } 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 { @@ -375,6 +376,7 @@ public: num_clients = 0; // defaults + memset(&_prefs, 0, sizeof(_prefs)); _prefs.airtime_factor = 1.0; // one half _prefs.rx_delay_base = 10.0; 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.freq = LORA_FREQ; _prefs.tx_power_dbm = LORA_TX_POWER; - memset(_prefs.unused, 0, sizeof(_prefs.unused)); } float getFreqPref() const { return _prefs.freq; } @@ -485,6 +486,10 @@ public: _prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec savePrefs(); 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) { _prefs.node_lat = atof(&config[4]); savePrefs(); diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index a2e77b21..c3a775d5 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -137,7 +137,8 @@ struct NodePrefs { // persisted to file char password[16]; float freq; uint8_t tx_power_dbm; - uint8_t unused[3]; + uint8_t disable_fwd; + uint8_t unused[2]; float rx_delay_base; }; @@ -252,11 +253,9 @@ protected: 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 { - 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 { 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; // defaults + memset(&_prefs, 0, sizeof(_prefs)); _prefs.airtime_factor = 1.0; // one half _prefs.rx_delay_base = 10.0; 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.freq = LORA_FREQ; _prefs.tx_power_dbm = LORA_TX_POWER; - memset(_prefs.unused, 0, sizeof(_prefs.unused)); + _prefs.disable_fwd = 1; num_clients = 0; next_post_idx = 0; @@ -605,6 +605,10 @@ public: _prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if nec savePrefs(); 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) { _prefs.node_lat = atof(&config[4]); savePrefs();