mirror of
https://github.com/meshtastic/firmware.git
synced 2026-09-23 06:45:24 -04:00
* logging: strip redundant punctuation, level prefixes, and 'successfully' from log strings The logger already appends a newline and prints the level tag, so trailing '.', '!', '...', literal \n, and 'Error:'/'Warning:' prefixes inside format strings are wasted flash bytes. Same for 'successfully' (the affirmative form already implies it). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: tighten verbose log strings in modules, radio, platform, and system code Rewrite wordy log messages to terser equivalents - drop filler words (articles, 'attempting', 'due to', 'please'), use 'Can't X'/'X failed' phrasing, and abbreviate where the codebase already does (config, init, msg, BT). Format specifiers and argument lists are unchanged; distinctive greppable tokens are preserved. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: tighten verbose log strings in telemetry sensors and GPS Same terseness pass: drop filler, 'Can't X'/'X failed' phrasing, common abbreviations (temp, msg). Specifiers, arguments, and sensor-name prefixes unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: tighten verbose log strings in mesh core Same terseness pass over NodeDB, Router, MeshService, PhoneAPI, RadioInterface, NextHopRouter, and PacketHistory: 'X failed'/'Can't X' phrasing, imperative verbs, dropped filler. Specifiers and arguments unchanged; duplicate literals kept identical to preserve linker string dedup. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: 'Unable to/Could not/Cannot' -> "Can't" in log strings Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: clang-format rewrap after string shortening Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * logging: restore boot-logo trailing newline and progress-dot strings The terseness pass over-trimmed: the Meshtastic ASCII boot logo kept its blank line via a trailing \n, and three bare "." progress ticks were reduced to empty strings. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBiZc9sfPrH1MZ2L3Fxgt1 * Update src/mesh/wifi/WiFiAPClient.cpp Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * logging: address review feedback on the terseness audit - Node/packet IDs use the repo's 0x%08x convention in NextHopRouter, NodeDB, AdminModule and CannedMessageModule. The sibling log in each if/else pair is converted too, so a pair isn't split across two formats. next_hop stays 0x%x - it's the last-byte relay hint, not a NodeNum. - RTC: the read-path and set-path "not found" warnings were byte-identical, so the linker deduped them and the log couldn't say which one fired. Split into "RTC read:" / "RTC set:". (The four sites live in mutually exclusive #ifdef branches, so the RTC family was never ambiguous.) - SCD4X getAmbientPressure()/setAmbientPressure() logged "altitude", and SCD30 getASC() logged "Can't send command" for a read. Both now name the operation they actually perform. - LOG_ERROR already carries the level: ". Error: %u" -> ", rc=%u" (matching the existing rc=%d house style) and "Error executing X()" -> "X() failed". - Typos and wording: "OTA partiton. (Reason" -> "OTA partition (reason", "CST3530 not response ~" -> "CST3530 no response", "Packet received with to: of 0" -> "to=0", HostMetrics "Error decoding" -> "Can't decode", and the dangling ": " on the NextHopRouter retransmission line. Printf specifier sequences are byte-identical on all 37 touched lines apart from the 6 deliberate %x/%u -> %08x node-ID widenings, all on uint32_t args. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
127 lines
4.7 KiB
C++
127 lines
4.7 KiB
C++
#pragma once
|
|
#include "SinglePortModule.h"
|
|
|
|
/**
|
|
* A base class for mesh modules that assume that they are sending/receiving one particular protobuf based
|
|
* payload. Using one particular app ID.
|
|
*
|
|
* If you are using protobufs to encode your packets (recommended) you can use this as a baseclass for your module
|
|
* and avoid a bunch of boilerplate code.
|
|
*/
|
|
template <class T> class ProtobufModule : protected SinglePortModule
|
|
{
|
|
const pb_msgdesc_t *fields;
|
|
|
|
public:
|
|
uint16_t numOnlineNodes = 0;
|
|
/** Constructor
|
|
* name is for debugging output
|
|
*/
|
|
ProtobufModule(const char *_name, meshtastic_PortNum _ourPortNum, const pb_msgdesc_t *_fields)
|
|
: SinglePortModule(_name, _ourPortNum), fields(_fields)
|
|
{
|
|
}
|
|
|
|
protected:
|
|
/**
|
|
* Handle a received message, the data field in the message is already decoded and is provided
|
|
*
|
|
* In general decoded will always be !NULL. But in some special applications (where you have handling packets
|
|
* for multiple port numbers, decoding will ONLY be attempted for packets where the portnum matches our expected ourPortNum.
|
|
*/
|
|
virtual bool handleReceivedProtobuf(const meshtastic_MeshPacket &mp, T *decoded) = 0;
|
|
|
|
/** Called to make changes to a particular incoming message
|
|
*/
|
|
virtual void alterReceivedProtobuf(meshtastic_MeshPacket &mp, T *decoded){};
|
|
|
|
/**
|
|
* Return a mesh packet which has been preinited with a particular protobuf data payload and port number.
|
|
* You can then send this packet (after customizing any of the payload fields you might need) with
|
|
* service->sendToMesh()
|
|
*/
|
|
meshtastic_MeshPacket *allocDataProtobuf(const T &payload)
|
|
{
|
|
// Update our local node info with our position (even if we don't decide to update anyone else)
|
|
meshtastic_MeshPacket *p = allocDataPacket();
|
|
if (!p)
|
|
return nullptr;
|
|
|
|
p->decoded.payload.size =
|
|
pb_encode_to_bytes(p->decoded.payload.bytes, sizeof(p->decoded.payload.bytes), fields, &payload);
|
|
// LOG_DEBUG("did encode");
|
|
return p;
|
|
}
|
|
|
|
/**
|
|
* Gets the short name from the sender of the mesh packet
|
|
* Returns "???" if unknown sender
|
|
*/
|
|
const char *getSenderShortName(const meshtastic_MeshPacket &mp)
|
|
{
|
|
auto node = nodeDB->getMeshNode(getFrom(&mp));
|
|
const char *sender = (node && nodeInfoLiteHasUser(node) && node->short_name[0]) ? node->short_name : "???";
|
|
return sender;
|
|
}
|
|
|
|
int handleStatusUpdate(const meshtastic::Status *arg)
|
|
{
|
|
if (arg->getStatusType() == STATUS_TYPE_NODE) {
|
|
numOnlineNodes = nodeStatus->getNumOnline();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private:
|
|
/** Called to handle a particular incoming message
|
|
|
|
@return ProcessMessage::STOP if you've guaranteed you've handled this message and no other handlers should be considered for
|
|
it
|
|
*/
|
|
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override
|
|
{
|
|
// FIXME - we currently update position data in the DB only if the message was a broadcast or destined to us
|
|
// it would be better to update even if the message was destined to others.
|
|
|
|
auto &p = mp.decoded;
|
|
|
|
T scratch;
|
|
T *decoded = NULL;
|
|
if (mp.which_payload_variant == meshtastic_MeshPacket_decoded_tag && mp.decoded.portnum == ourPortNum) {
|
|
memset(&scratch, 0, sizeof(scratch));
|
|
if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, fields, &scratch)) {
|
|
decoded = &scratch;
|
|
LOG_INFO("Received %s from=0x%08x, id=0x%08x, portnum=%d, payloadlen=%d", name, mp.from, mp.id, p.portnum,
|
|
p.payload.size);
|
|
} else {
|
|
LOG_ERROR("Error decoding proto module");
|
|
// if we can't decode it, nobody can process it!
|
|
return ProcessMessage::STOP;
|
|
}
|
|
}
|
|
|
|
return handleReceivedProtobuf(mp, decoded) ? ProcessMessage::STOP : ProcessMessage::CONTINUE;
|
|
}
|
|
|
|
/** Called to alter a particular incoming message
|
|
*/
|
|
virtual void alterReceived(meshtastic_MeshPacket &mp) override
|
|
{
|
|
T scratch;
|
|
T *decoded = NULL;
|
|
if (mp.which_payload_variant == meshtastic_MeshPacket_decoded_tag && mp.decoded.portnum == ourPortNum) {
|
|
memset(&scratch, 0, sizeof(scratch));
|
|
const meshtastic_Data &p = mp.decoded;
|
|
if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, fields, &scratch)) {
|
|
decoded = &scratch;
|
|
} else {
|
|
LOG_ERROR("Error decoding proto module");
|
|
// if we can't decode it, nobody can process it!
|
|
return;
|
|
}
|
|
|
|
return alterReceivedProtobuf(mp, decoded);
|
|
}
|
|
}
|
|
};
|