mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-20 09:43:03 +00:00
improved destination filtering
This commit is contained in:
@@ -114,34 +114,19 @@ const StoredMessage &MessageStore::addFromPacket(const meshtastic_MeshPacket &pa
|
|||||||
sm.textOffset = storeTextInPool(payload, len);
|
sm.textOffset = storeTextInPool(payload, len);
|
||||||
sm.textLength = len;
|
sm.textLength = len;
|
||||||
|
|
||||||
|
// Determine sender
|
||||||
uint32_t localNode = nodeDB->getNodeNum();
|
uint32_t localNode = nodeDB->getNodeNum();
|
||||||
sm.sender = (packet.from == 0) ? localNode : packet.from;
|
sm.sender = (packet.from == 0) ? localNode : packet.from;
|
||||||
sm.dest = packet.decoded.dest;
|
|
||||||
|
|
||||||
// DM detection: use decoded.dest if valid, otherwise fallback to header 'to'
|
sm.dest = packet.to;
|
||||||
bool isDM = false;
|
|
||||||
uint32_t actualDest = sm.dest;
|
|
||||||
|
|
||||||
if (actualDest == 0 || actualDest == 0xffffffff) {
|
bool isDM = (sm.dest != 0 && sm.dest != NODENUM_BROADCAST);
|
||||||
actualDest = packet.to;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actualDest != 0 && actualDest != NODENUM_BROADCAST && actualDest == localNode) {
|
|
||||||
isDM = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Incoming vs outgoing classification
|
|
||||||
if (packet.from == 0) {
|
if (packet.from == 0) {
|
||||||
// Sent by us
|
|
||||||
sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST;
|
sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST;
|
||||||
sm.ackStatus = AckStatus::NONE;
|
sm.ackStatus = AckStatus::NONE;
|
||||||
} else {
|
} else {
|
||||||
// Received from another node
|
sm.type = isDM ? MessageType::DM_TO_US : MessageType::BROADCAST;
|
||||||
if (isDM) {
|
|
||||||
sm.type = MessageType::DM_TO_US;
|
|
||||||
} else {
|
|
||||||
sm.type = MessageType::BROADCAST;
|
|
||||||
}
|
|
||||||
sm.ackStatus = AckStatus::ACKED;
|
sm.ackStatus = AckStatus::ACKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,11 +147,11 @@ void MessageStore::addFromString(uint32_t sender, uint8_t channelIndex, const st
|
|||||||
sm.textOffset = storeTextInPool(text.c_str(), text.size());
|
sm.textOffset = storeTextInPool(text.c_str(), text.size());
|
||||||
sm.textLength = text.size();
|
sm.textLength = text.size();
|
||||||
|
|
||||||
// Default manual adds to broadcast
|
// Use the provided destination
|
||||||
sm.dest = NODENUM_BROADCAST;
|
sm.dest = sender;
|
||||||
sm.type = MessageType::BROADCAST;
|
sm.type = MessageType::DM_TO_US;
|
||||||
|
|
||||||
// Outgoing messages start as NONE until ACK/NACK arrives
|
// Outgoing messages always start with unknown ack status
|
||||||
sm.ackStatus = AckStatus::NONE;
|
sm.ackStatus = AckStatus::NONE;
|
||||||
|
|
||||||
addLiveMessage(sm);
|
addLiveMessage(sm);
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
|||||||
include = true;
|
include = true;
|
||||||
break;
|
break;
|
||||||
case ThreadMode::DIRECT:
|
case ThreadMode::DIRECT:
|
||||||
if (m.type == MessageType::DM_TO_US && (m.sender == currentPeer || m.dest == currentPeer))
|
if (m.dest != NODENUM_BROADCAST && (m.sender == currentPeer || m.dest == currentPeer))
|
||||||
include = true;
|
include = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -846,15 +846,6 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack
|
|||||||
snprintf(contextBuf, sizeof(contextBuf), "in #%s", cname);
|
snprintf(contextBuf, sizeof(contextBuf), "in #%s", cname);
|
||||||
else
|
else
|
||||||
snprintf(contextBuf, sizeof(contextBuf), "in Ch%d", sm.channelIndex);
|
snprintf(contextBuf, sizeof(contextBuf), "in Ch%d", sm.channelIndex);
|
||||||
} else if (sm.type == MessageType::DM_TO_US) {
|
|
||||||
/* Commenting out to better understand if we need this info in the banner
|
|
||||||
uint32_t peer = (packet.from == 0) ? sm.dest : sm.sender;
|
|
||||||
const meshtastic_NodeInfoLite *peerNode = nodeDB->getMeshNode(peer);
|
|
||||||
if (peerNode && peerNode->has_user && peerNode->user.short_name)
|
|
||||||
snprintf(contextBuf, sizeof(contextBuf), "Direct: @%s", peerNode->user.short_name);
|
|
||||||
else
|
|
||||||
snprintf(contextBuf, sizeof(contextBuf), "Direct Message");
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contextBuf[0]) {
|
if (contextBuf[0]) {
|
||||||
@@ -892,12 +883,11 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack
|
|||||||
|
|
||||||
void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet)
|
void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet)
|
||||||
{
|
{
|
||||||
if (sm.dest == NODENUM_BROADCAST || sm.type == MessageType::BROADCAST) {
|
if (packet.to == 0 || packet.to == NODENUM_BROADCAST) {
|
||||||
// Broadcast
|
|
||||||
setThreadMode(ThreadMode::CHANNEL, sm.channelIndex);
|
setThreadMode(ThreadMode::CHANNEL, sm.channelIndex);
|
||||||
} else {
|
} else {
|
||||||
// Direct message
|
uint32_t localNode = nodeDB->getNodeNum();
|
||||||
uint32_t peer = (packet.from != 0) ? sm.sender : sm.dest;
|
uint32_t peer = (sm.sender == localNode) ? packet.to : sm.sender;
|
||||||
setThreadMode(ThreadMode::DIRECT, -1, peer);
|
setThreadMode(ThreadMode::DIRECT, -1, peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user