From bc5d648204c06aadd6370a474050a949f431dca8 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Mon, 1 Jun 2026 19:04:42 +1000 Subject: [PATCH] * contacts sync fix * fix for reusing transient/anon contacts only --- examples/companion_radio/MyMesh.cpp | 10 +++++++++- src/helpers/BaseChatMesh.cpp | 21 ++++++++++++++------- src/helpers/BaseChatMesh.h | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index d75d6776..bff571e0 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -2186,7 +2186,15 @@ void MyMesh::checkSerialInterface() { && !_serial->isWriteBusy() // don't spam the Serial Interface too quickly! ) { ContactInfo contact; - if (_iter.hasNext(this, contact)) { + bool found = false; + while (_iter.hasNext(this, contact)) { + if (contact.type != ADV_TYPE_NONE) { + found = true; + break; + } + } + + if (found) { if (contact.lastmod > _iter_filter_since) { // apply the 'since' filter writeContactRespFrame(RESP_CODE_CONTACT, contact); if (contact.lastmod > _most_recent_lastmod) { diff --git a/src/helpers/BaseChatMesh.cpp b/src/helpers/BaseChatMesh.cpp index 5a720c83..d3ef034e 100644 --- a/src/helpers/BaseChatMesh.cpp +++ b/src/helpers/BaseChatMesh.cpp @@ -67,18 +67,25 @@ void BaseChatMesh::bootstrapRTCfromContacts() { } } -ContactInfo* BaseChatMesh::allocateContactSlot() { +ContactInfo* BaseChatMesh::allocateContactSlot(bool transient_only) { if (num_contacts < MAX_CONTACTS) { return &contacts[num_contacts++]; - } else if (shouldOverwriteWhenFull()) { + } else if (transient_only || shouldOverwriteWhenFull()) { // Find oldest non-favourite contact by oldest lastmod timestamp int oldest_idx = -1; uint32_t oldest_lastmod = 0xFFFFFFFF; for (int i = 0; i < num_contacts; i++) { - bool is_favourite = (contacts[i].flags & 0x01) != 0; - if (!is_favourite && contacts[i].lastmod < oldest_lastmod && contacts[i].type != ADV_TYPE_NONE) { - oldest_lastmod = contacts[i].lastmod; - oldest_idx = i; + if (transient_only) { + if (contacts[i].type == ADV_TYPE_NONE && contacts[i].lastmod < oldest_lastmod) { + oldest_lastmod = contacts[i].lastmod; + oldest_idx = i; + } + } else { + bool is_favourite = (contacts[i].flags & 0x01) != 0; + if (!is_favourite && contacts[i].lastmod < oldest_lastmod && contacts[i].type != ADV_TYPE_NONE) { + oldest_lastmod = contacts[i].lastmod; + oldest_idx = i; + } } } if (oldest_idx >= 0) { @@ -830,7 +837,7 @@ ContactInfo* BaseChatMesh::lookupContactByPubKey(const uint8_t* pub_key, int pre } bool BaseChatMesh::addContact(const ContactInfo& contact) { - ContactInfo* dest = allocateContactSlot(); + ContactInfo* dest = allocateContactSlot(contact.type == ADV_TYPE_NONE); if (dest) { *dest = contact; dest->shared_secret_valid = false; // mark shared_secret as needing calculation diff --git a/src/helpers/BaseChatMesh.h b/src/helpers/BaseChatMesh.h index bd92d9d8..c04bfda3 100644 --- a/src/helpers/BaseChatMesh.h +++ b/src/helpers/BaseChatMesh.h @@ -93,7 +93,7 @@ protected: void bootstrapRTCfromContacts(); void resetContacts() { num_contacts = 0; } void populateContactFromAdvert(ContactInfo& ci, const mesh::Identity& id, const AdvertDataParser& parser, uint32_t timestamp); - ContactInfo* allocateContactSlot(); // helper to find slot for new contact + ContactInfo* allocateContactSlot(bool transient_only=false); // helper to find slot for new contact // 'UI' concepts, for sub-classes to implement virtual bool isAutoAddEnabled() const { return true; }