diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 8e5dce838..a48ffaf98 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1446,12 +1446,12 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) sm.channelIndex = packet->channel; sm.text = std::string(reinterpret_cast(packet->decoded.payload.bytes)); - // Distinguish between broadcast vs DM to us + // Distinguish between broadcast vs DM to peer if (packet->decoded.dest == NODENUM_BROADCAST) { sm.dest = NODENUM_BROADCAST; sm.type = MessageType::BROADCAST; } else { - sm.dest = nodeDB->getNodeNum(); + sm.dest = packet->decoded.dest; // peer node, not us sm.type = MessageType::DM_TO_US; } @@ -1461,7 +1461,9 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) if (sm.type == MessageType::BROADCAST) { graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::CHANNEL, sm.channelIndex); } else if (sm.type == MessageType::DM_TO_US) { - graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::DIRECT, -1, sm.sender); + graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::DIRECT, -1, + sm.dest // use peer node + ); } // 🔹 Reset scroll so newest message starts from the top @@ -1532,7 +1534,7 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) sm.dest = NODENUM_BROADCAST; sm.type = MessageType::BROADCAST; } else { - sm.dest = nodeDB->getNodeNum(); // DM to us + sm.dest = nodeDB->getNodeNum(); // our node (we are DM target) sm.type = MessageType::DM_TO_US; } @@ -1542,7 +1544,9 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) if (sm.type == MessageType::BROADCAST) { graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::CHANNEL, sm.channelIndex); } else if (sm.type == MessageType::DM_TO_US) { - graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::DIRECT, -1, sm.sender); + graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::DIRECT, -1, + sm.sender // use peer node + ); } // Reset scroll so newest message starts from the top diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 522bd5ae5..2160bfd40 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -444,7 +444,7 @@ void menuHandler::messageViewModeMenu() labels.push_back("View All"); ids.push_back(-2); - // --- Add channels with live messages --- + // Add channels with live messages for (int ch = 0; ch < 8; ++ch) { auto msgs = messageStore.getChannelMessages(ch); if (!msgs.empty()) { @@ -460,7 +460,7 @@ void menuHandler::messageViewModeMenu() } } - // --- Add channels from registry --- + // Add channels from registry for (int ch : graphics::MessageRenderer::getSeenChannels()) { if (std::find(ids.begin(), ids.end(), 100 + ch) == ids.end()) { char buf[40]; @@ -475,39 +475,40 @@ void menuHandler::messageViewModeMenu() } } - // --- Add DMs from live store --- + // Add DMs from live store auto dms = messageStore.getDirectMessages(); - std::vector uniqueSenders; + std::vector uniquePeers; for (auto &m : dms) { - if (std::find(uniqueSenders.begin(), uniqueSenders.end(), m.sender) == uniqueSenders.end()) { - uniqueSenders.push_back(m.sender); + uint32_t peer = (m.sender == nodeDB->getNodeNum()) ? m.dest : m.sender; + if (peer != nodeDB->getNodeNum() && std::find(uniquePeers.begin(), uniquePeers.end(), peer) == uniquePeers.end()) { + uniquePeers.push_back(peer); } } - // --- Add DMs from registry --- + // Add DMs from registry for (uint32_t peer : graphics::MessageRenderer::getSeenPeers()) { - if (std::find(uniqueSenders.begin(), uniqueSenders.end(), peer) == uniqueSenders.end()) { - uniqueSenders.push_back(peer); + if (peer != nodeDB->getNodeNum() && std::find(uniquePeers.begin(), uniquePeers.end(), peer) == uniquePeers.end()) { + uniquePeers.push_back(peer); } } - std::sort(uniqueSenders.begin(), uniqueSenders.end()); + std::sort(uniquePeers.begin(), uniquePeers.end()); - for (auto sender : uniqueSenders) { - auto node = nodeDB->getMeshNode(sender); + for (auto peer : uniquePeers) { + auto node = nodeDB->getMeshNode(peer); std::string name; if (node && node->has_user) { name = sanitizeString(node->user.long_name).substr(0, 15); } else { char buf[20]; - snprintf(buf, sizeof(buf), "Node %08X", sender); + snprintf(buf, sizeof(buf), "Node %08X", peer); name = buf; } labels.push_back("DM: " + name); - ids.push_back(sender); + ids.push_back(peer); } - // --- Determine active ID --- + // Determine active ID int activeId = -2; auto mode = graphics::MessageRenderer::getThreadMode(); if (mode == graphics::MessageRenderer::ThreadMode::ALL) { diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index 72c1b93aa..295199d5a 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -192,12 +192,12 @@ void resetScrollState() didReset = false; // <-- now valid } -// --- Current thread state --- +// Current thread state static ThreadMode currentMode = ThreadMode::ALL; static int currentChannel = -1; static uint32_t currentPeer = 0; -// --- Registry of seen threads for manual toggle --- +// Registry of seen threads for manual toggle static std::vector seenChannels; static std::vector seenPeers; @@ -270,7 +270,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 include = true; break; case ThreadMode::DIRECT: - if (m.type == MessageType::DM_TO_US && m.sender == currentPeer) + if (m.type == MessageType::DM_TO_US && (m.sender == currentPeer || m.dest == currentPeer)) include = true; break; } @@ -344,7 +344,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 for (auto it = filtered.rbegin(); it != filtered.rend(); ++it) { const auto &m = *it; - // --- Build header line for this message --- + // Build header line for this message meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(m.sender); const char *sender = "???"; #if defined(M5STACK_UNITC6L) @@ -408,7 +408,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 isMine.push_back(mine); isHeader.push_back(true); - // --- Split message text into wrapped lines --- + // Split message text into wrapped lines std::vector wrapped = generateLines(display, "", m.text.c_str(), textWidth); for (auto &ln : wrapped) { allLines.push_back(ln); diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 33cbe031a..d9cc29d84 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -808,7 +808,7 @@ bool CannedMessageModule::handleFreeTextInput(const InputEvent *event) } #endif // USE_VIRTUAL_KEYBOARD - // ---- All hardware keys fall through to here (CardKB, physical, etc.) ---- + // All hardware keys fall through to here (CardKB, physical, etc.) if (event->kbchar == INPUT_BROKER_MSG_EMOTE_LIST) { runState = CANNED_MESSAGE_RUN_STATE_EMOTE_PICKER; @@ -975,7 +975,7 @@ void CannedMessageModule::sendText(NodeNum dest, ChannelIndex channel, const cha // Save outgoing message StoredMessage sm; sm.timestamp = millis() / 1000; - sm.sender = nodeDB->getNodeNum(); + sm.sender = nodeDB->getNodeNum(); // us sm.channelIndex = channel; sm.text = std::string(message); @@ -1759,7 +1759,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st #endif #endif - // --- Delivery Status Message --- + // Delivery Status Message if (this->ack) { if (this->lastSentNode == NODENUM_BROADCAST) { snprintf(buffer, sizeof(buffer), "Broadcast Sent to\n%s", channels.getName(this->channel)); @@ -1787,7 +1787,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st yOffset += lineCount * FONT_HEIGHT_MEDIUM; // only 1 line gap, no extra padding #endif #ifndef USE_EINK - // --- SNR + RSSI Compact Line --- + // SNR + RSSI Compact Line if (this->ack) { display->setFont(FONT_SMALL); #if defined(M5STACK_UNITC6L) @@ -1837,10 +1837,10 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(FONT_SMALL); - // --- Draw node/channel header at the top --- + // Draw node/channel header at the top drawHeader(display, x, y, buffer); - // --- Char count right-aligned --- + // Char count right-aligned if (runState != CANNED_MESSAGE_RUN_STATE_DESTINATION_SELECTION) { uint16_t charsLeft = meshtastic_Constants_DATA_PAYLOAD_LEN - this->freetext.length() - (moduleConfig.canned_message.send_bell ? 1 : 0); @@ -1848,7 +1848,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st display->drawString(x + display->getWidth() - display->getStringWidth(buffer), y + 0, buffer); } - // --- Draw Free Text input with multi-emote support and proper line wrapping --- + // Draw Free Text input with multi-emote support and proper line wrapping display->setColor(WHITE); { int inputY = 0 + y + FONT_HEIGHT_SMALL; @@ -2019,7 +2019,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st : 0; int countRows = std::min(messagesCount, _visibleRows); - // --- Build per-row max height based on all emotes in line --- + // Build per-row max height based on all emotes in line for (int i = 0; i < countRows; i++) { const char *msg = getMessageByIndex(topMsg + i); int maxEmoteHeight = 0; @@ -2037,7 +2037,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st rowHeights.push_back(std::max(baseRowSpacing, maxEmoteHeight + 2)); } - // --- Draw all message rows with multi-emote support --- + // Draw all message rows with multi-emote support int yCursor = listYOffset; for (int vis = 0; vis < countRows; vis++) { int msgIdx = topMsg + vis; @@ -2046,7 +2046,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st int rowHeight = rowHeights[vis]; bool _highlight = (msgIdx == currentMessageIndex); - // --- Multi-emote tokenization --- + // Multi-emote tokenization std::vector> tokens; // (isEmote, token) int pos = 0; int msgLen = strlen(msg); @@ -2091,7 +2091,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st } } } - // --- End multi-emote tokenization --- + // End multi-emote tokenization // Vertically center based on rowHeight int textYOffset = (rowHeight - FONT_HEIGHT_SMALL) / 2;