mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-07-30 08:48:12 +00:00
feat(ui): DM auto-resend + incoming dedup + channel relay ring
DM auto-resend (delivery status follow-up): - New pref dm_resend_count (0-5, default 2), Settings › Messages › Resend. Schema sentinel 0xC0DE0009 → 0xC0DE000A; old files clamp to the default. - When a pending on-device DM passes its ACK deadline, tickDmResends() (driven from UITask::loop, so it runs in the background regardless of the active screen) re-sends with the next attempt# reusing the original timestamp, refreshing ack_tag/deadline, until resends run out → then ✗. - dmEffectiveStatus keeps the entry pending while resends remain. Incoming DM dedup: - A retry reuses the sender timestamp + text but has a fresh packet hash, so the mesh dup-filter passes it. addDMMsg now takes sender_timestamp and drops copies matching prefix+timestamp+text. sender_timestamp plumbed from MyMesh::queueMessage through AbstractUITask/UITask. Channel relay ring: - Replace the single-slot relayed-into-mesh tracker with a 4-slot ring so a quick burst of channel sends are each matched to their repeater echo. Receive-path hashing still gated (now on _relay_active) so the hot flood path is untouched when idle. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1380,8 +1380,8 @@ void UITask::onChannelRelayed(uint32_t seq) {
|
||||
((QuickMsgScreen*)quick_msg)->markChannelRelayed(seq);
|
||||
}
|
||||
|
||||
void UITask::addDMMsg(const uint8_t* pub_key, bool outgoing, const char* text) {
|
||||
((QuickMsgScreen*)quick_msg)->addDMMsg(pub_key, outgoing, text);
|
||||
void UITask::addDMMsg(const uint8_t* pub_key, bool outgoing, const char* text, uint32_t sender_timestamp) {
|
||||
((QuickMsgScreen*)quick_msg)->addDMMsg(pub_key, outgoing, text, sender_timestamp);
|
||||
}
|
||||
|
||||
int UITask::getDMUnreadTotal() const {
|
||||
@@ -1610,6 +1610,9 @@ static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_m
|
||||
|
||||
void UITask::loop() {
|
||||
char c = 0;
|
||||
// Background delivery: resend pending on-device DMs whose ACK timed out, and
|
||||
// finalise the ✗ marker — runs regardless of which screen is active.
|
||||
((QuickMsgScreen*)quick_msg)->tickDmResends();
|
||||
#if UI_HAS_JOYSTICK
|
||||
uint8_t joy_rot = _node_prefs ? _node_prefs->joystick_rotation : JOYSTICK_ROTATION;
|
||||
int ev = user_btn.check();
|
||||
|
||||
Reference in New Issue
Block a user