From ad19ac1ab3263e64ca32bae0ab1ac941eebe8142 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 25 Jul 2025 22:59:48 +1000 Subject: [PATCH] * Companion: CMD_ADD_UPDATE_CONTACT now with optional extra 'last_mod' timestamp --- examples/companion_radio/MyMesh.cpp | 14 +++++++++----- examples/companion_radio/MyMesh.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 939c93de..a7c0333c 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -152,7 +152,7 @@ void MyMesh::writeContactRespFrame(uint8_t code, const ContactInfo &contact) { _serial->writeFrame(out_frame, i); } -void MyMesh::updateContactFromFrame(ContactInfo &contact, const uint8_t *frame, int len) { +void MyMesh::updateContactFromFrame(ContactInfo &contact, uint32_t& last_mod, const uint8_t *frame, int len) { int i = 0; uint8_t code = frame[i++]; // eg. CMD_ADD_UPDATE_CONTACT memcpy(contact.id.pub_key, &frame[i], PUB_KEY_SIZE); @@ -171,6 +171,9 @@ void MyMesh::updateContactFromFrame(ContactInfo &contact, const uint8_t *frame, i += 4; memcpy(&contact.gps_lon, &frame[i], 4); i += 4; + if (i + 4 >= len) { + memcpy(&last_mod, &frame[i], 4); + } } } @@ -896,15 +899,16 @@ void MyMesh::handleCmdFrame(size_t len) { } else if (cmd_frame[0] == CMD_ADD_UPDATE_CONTACT && len >= 1 + 32 + 2 + 1) { uint8_t *pub_key = &cmd_frame[1]; ContactInfo *recipient = lookupContactByPubKey(pub_key, PUB_KEY_SIZE); + uint32_t last_mod = getRTCClock()->getCurrentTime(); // fallback value if not present in cmd_frame if (recipient) { - updateContactFromFrame(*recipient, cmd_frame, len); - // recipient->lastmod = ?? shouldn't be needed, app already has this version of contact + updateContactFromFrame(*recipient, last_mod, cmd_frame, len); + recipient->lastmod = last_mod; dirty_contacts_expiry = futureMillis(LAZY_CONTACTS_WRITE_DELAY); writeOKFrame(); } else { ContactInfo contact; - updateContactFromFrame(contact, cmd_frame, len); - contact.lastmod = getRTCClock()->getCurrentTime(); + updateContactFromFrame(contact, last_mod, cmd_frame, len); + contact.lastmod = last_mod; contact.sync_since = 0; if (addContact(contact)) { dirty_contacts_expiry = futureMillis(LAZY_CONTACTS_WRITE_DELAY); diff --git a/examples/companion_radio/MyMesh.h b/examples/companion_radio/MyMesh.h index 5ad6198f..e2e96ff4 100644 --- a/examples/companion_radio/MyMesh.h +++ b/examples/companion_radio/MyMesh.h @@ -138,7 +138,7 @@ private: void writeErrFrame(uint8_t err_code); void writeDisabledFrame(); void writeContactRespFrame(uint8_t code, const ContactInfo &contact); - void updateContactFromFrame(ContactInfo &contact, const uint8_t *frame, int len); + void updateContactFromFrame(ContactInfo &contact, uint32_t& last_mod, const uint8_t *frame, int len); void addToOfflineQueue(const uint8_t frame[], int len); int getFromOfflineQueue(uint8_t frame[]); int getBlobByKey(const uint8_t key[], int key_len, uint8_t dest_buf[]) override {