@alteriom/painlessmesh 1.8.14 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +89 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +70 -143
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/docs/troubleshooting/faq.md +113 -12
- package/examples/basic/test/simulator/CMakeLists.txt +40 -0
- package/examples/basic/test/simulator/README.md +149 -0
- package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
- package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
- package/examples/bridge/bridge.ino +17 -4
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +51 -6
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -3
- package/src/arduino/wifi.hpp +380 -13
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -96
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -111
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#ifndef _PAINLESS_MESH_MESSAGE_TRACKER_HPP_
|
|
2
|
+
#define _PAINLESS_MESH_MESSAGE_TRACKER_HPP_
|
|
3
|
+
|
|
4
|
+
#include <map>
|
|
5
|
+
#include <algorithm>
|
|
6
|
+
#include "painlessmesh/configuration.hpp"
|
|
7
|
+
#include "painlessmesh/logger.hpp"
|
|
8
|
+
|
|
9
|
+
// External logger instance
|
|
10
|
+
extern painlessmesh::logger::LogClass Log;
|
|
11
|
+
|
|
12
|
+
namespace painlessmesh {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Key for tracking messages by their unique combination of ID and origin node
|
|
16
|
+
*/
|
|
17
|
+
struct MessageKey {
|
|
18
|
+
uint32_t messageId;
|
|
19
|
+
uint32_t originNode;
|
|
20
|
+
|
|
21
|
+
bool operator<(const MessageKey& other) const {
|
|
22
|
+
if (messageId != other.messageId) {
|
|
23
|
+
return messageId < other.messageId;
|
|
24
|
+
}
|
|
25
|
+
return originNode < other.originNode;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
bool operator==(const MessageKey& other) const {
|
|
29
|
+
return messageId == other.messageId && originNode == other.originNode;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Tracked message entry with timestamp and acknowledgment status
|
|
35
|
+
*/
|
|
36
|
+
struct TrackedMessage {
|
|
37
|
+
uint32_t timestamp; // When the message was first processed (millis)
|
|
38
|
+
bool acknowledged; // Whether the message has been acknowledged
|
|
39
|
+
|
|
40
|
+
TrackedMessage() : timestamp(0), acknowledged(false) {}
|
|
41
|
+
TrackedMessage(uint32_t ts) : timestamp(ts), acknowledged(false) {}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* MessageTracker - Prevents duplicate message processing and tracks acknowledgments
|
|
46
|
+
*
|
|
47
|
+
* This class provides efficient tracking of processed messages to prevent
|
|
48
|
+
* duplicate processing in mesh networks. It supports:
|
|
49
|
+
* - Configurable maximum tracked messages (memory-efficient for ESP8266)
|
|
50
|
+
* - Automatic cleanup of expired entries
|
|
51
|
+
* - Acknowledgment tracking for reliable delivery
|
|
52
|
+
* - Thread-safe consideration for ESP32
|
|
53
|
+
*
|
|
54
|
+
* Example usage:
|
|
55
|
+
* \code
|
|
56
|
+
* MessageTracker tracker(500, 60000); // Max 500 messages, 60s timeout
|
|
57
|
+
*
|
|
58
|
+
* uint32_t msgId = 12345;
|
|
59
|
+
* uint32_t originNode = 67890;
|
|
60
|
+
*
|
|
61
|
+
* // Check if message was already processed
|
|
62
|
+
* if (!tracker.isProcessed(msgId, originNode)) {
|
|
63
|
+
* // Process the message
|
|
64
|
+
* processMessage(msg);
|
|
65
|
+
*
|
|
66
|
+
* // Mark as processed
|
|
67
|
+
* tracker.markProcessed(msgId, originNode);
|
|
68
|
+
* }
|
|
69
|
+
*
|
|
70
|
+
* // Later, mark as acknowledged
|
|
71
|
+
* tracker.markAcknowledged(msgId, originNode);
|
|
72
|
+
*
|
|
73
|
+
* // Periodically cleanup old entries
|
|
74
|
+
* tracker.cleanup();
|
|
75
|
+
* \endcode
|
|
76
|
+
*/
|
|
77
|
+
class MessageTracker {
|
|
78
|
+
public:
|
|
79
|
+
/**
|
|
80
|
+
* Constructor
|
|
81
|
+
* @param maxMessages Maximum number of messages to track (default: 500)
|
|
82
|
+
* @param timeoutMs Timeout in milliseconds for automatic cleanup (default: 60000)
|
|
83
|
+
*/
|
|
84
|
+
MessageTracker(uint16_t maxMessages = 500, uint32_t timeoutMs = 60000)
|
|
85
|
+
: maxTrackedMessages(maxMessages), messageTimeoutMs(timeoutMs) {}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Check if a message has already been processed
|
|
89
|
+
* @param messageId The unique message identifier
|
|
90
|
+
* @param originNode The node that originated the message
|
|
91
|
+
* @return true if the message was already processed, false otherwise
|
|
92
|
+
*/
|
|
93
|
+
bool isProcessed(uint32_t messageId, uint32_t originNode) {
|
|
94
|
+
MessageKey key = {messageId, originNode};
|
|
95
|
+
auto it = trackedMessages.find(key);
|
|
96
|
+
return it != trackedMessages.end();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Mark a message as processed
|
|
101
|
+
* If the tracker is at capacity, oldest entries will be removed first.
|
|
102
|
+
* Note: If maxMessages is 0, this method does nothing and returns false.
|
|
103
|
+
* @param messageId The unique message identifier
|
|
104
|
+
* @param originNode The node that originated the message
|
|
105
|
+
* @return true if message was tracked, false if capacity is 0
|
|
106
|
+
*/
|
|
107
|
+
bool markProcessed(uint32_t messageId, uint32_t originNode) {
|
|
108
|
+
MessageKey key = {messageId, originNode};
|
|
109
|
+
uint32_t currentTime = millis();
|
|
110
|
+
|
|
111
|
+
// Check if already exists
|
|
112
|
+
auto it = trackedMessages.find(key);
|
|
113
|
+
if (it != trackedMessages.end()) {
|
|
114
|
+
// Update timestamp but preserve acknowledged status
|
|
115
|
+
it->second.timestamp = currentTime;
|
|
116
|
+
Log(logger::GENERAL, "MessageTracker: Updated message %u from node %u\n",
|
|
117
|
+
messageId, originNode);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Handle capacity 0 case - don't add new entries
|
|
122
|
+
if (maxTrackedMessages == 0) {
|
|
123
|
+
Log(logger::GENERAL, "MessageTracker: Cannot track message %u (capacity=0)\n",
|
|
124
|
+
messageId);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Enforce memory limits before adding new entry
|
|
129
|
+
if (trackedMessages.size() >= maxTrackedMessages) {
|
|
130
|
+
enforceMemoryLimit();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Add new entry
|
|
134
|
+
trackedMessages[key] = TrackedMessage(currentTime);
|
|
135
|
+
Log(logger::GENERAL, "MessageTracker: Tracked message %u from node %u (size=%zu)\n",
|
|
136
|
+
messageId, originNode, trackedMessages.size());
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Mark a message as acknowledged
|
|
142
|
+
* @param messageId The unique message identifier
|
|
143
|
+
* @param originNode The node that originated the message
|
|
144
|
+
* @return true if the message was found and marked, false otherwise
|
|
145
|
+
*/
|
|
146
|
+
bool markAcknowledged(uint32_t messageId, uint32_t originNode) {
|
|
147
|
+
MessageKey key = {messageId, originNode};
|
|
148
|
+
auto it = trackedMessages.find(key);
|
|
149
|
+
|
|
150
|
+
if (it != trackedMessages.end()) {
|
|
151
|
+
it->second.acknowledged = true;
|
|
152
|
+
Log(logger::GENERAL, "MessageTracker: Acknowledged message %u from node %u\n",
|
|
153
|
+
messageId, originNode);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
Log(logger::GENERAL, "MessageTracker: Message %u from node %u not found for acknowledgment\n",
|
|
158
|
+
messageId, originNode);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Check if a message has been acknowledged
|
|
164
|
+
* @param messageId The unique message identifier
|
|
165
|
+
* @param originNode The node that originated the message
|
|
166
|
+
* @return true if acknowledged, false if not found or not acknowledged
|
|
167
|
+
*/
|
|
168
|
+
bool isAcknowledged(uint32_t messageId, uint32_t originNode) {
|
|
169
|
+
MessageKey key = {messageId, originNode};
|
|
170
|
+
auto it = trackedMessages.find(key);
|
|
171
|
+
|
|
172
|
+
if (it != trackedMessages.end()) {
|
|
173
|
+
return it->second.acknowledged;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Cleanup expired entries based on the configured timeout
|
|
181
|
+
* @return Number of entries removed
|
|
182
|
+
*/
|
|
183
|
+
uint32_t cleanup() {
|
|
184
|
+
uint32_t currentTime = millis();
|
|
185
|
+
uint32_t removedCount = 0;
|
|
186
|
+
|
|
187
|
+
auto it = trackedMessages.begin();
|
|
188
|
+
while (it != trackedMessages.end()) {
|
|
189
|
+
// Handle millis() overflow - if currentTime < timestamp, assume overflow
|
|
190
|
+
uint32_t age;
|
|
191
|
+
if (currentTime >= it->second.timestamp) {
|
|
192
|
+
age = currentTime - it->second.timestamp;
|
|
193
|
+
} else {
|
|
194
|
+
// Overflow occurred
|
|
195
|
+
age = (0xFFFFFFFF - it->second.timestamp) + currentTime + 1;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (age > messageTimeoutMs) {
|
|
199
|
+
it = trackedMessages.erase(it);
|
|
200
|
+
removedCount++;
|
|
201
|
+
} else {
|
|
202
|
+
++it;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (removedCount > 0) {
|
|
207
|
+
Log(logger::GENERAL, "MessageTracker: Cleaned up %u expired entries (size=%zu)\n",
|
|
208
|
+
removedCount, trackedMessages.size());
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return removedCount;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get the current number of tracked messages
|
|
216
|
+
* @return Number of entries in the tracker
|
|
217
|
+
*/
|
|
218
|
+
size_t size() const {
|
|
219
|
+
return trackedMessages.size();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Check if the tracker is empty
|
|
224
|
+
* @return true if no messages are being tracked
|
|
225
|
+
*/
|
|
226
|
+
bool empty() const {
|
|
227
|
+
return trackedMessages.empty();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Clear all tracked messages
|
|
232
|
+
*/
|
|
233
|
+
void clear() {
|
|
234
|
+
trackedMessages.clear();
|
|
235
|
+
Log(logger::GENERAL, "MessageTracker: Cleared all entries\n");
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get the maximum number of tracked messages
|
|
240
|
+
* @return Configured maximum
|
|
241
|
+
*/
|
|
242
|
+
uint16_t getMaxMessages() const {
|
|
243
|
+
return maxTrackedMessages;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Get the timeout value in milliseconds
|
|
248
|
+
* @return Configured timeout
|
|
249
|
+
*/
|
|
250
|
+
uint32_t getTimeoutMs() const {
|
|
251
|
+
return messageTimeoutMs;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Set a new maximum for tracked messages
|
|
256
|
+
* If current size exceeds new max, oldest entries will be removed
|
|
257
|
+
* @param maxMessages New maximum
|
|
258
|
+
*/
|
|
259
|
+
void setMaxMessages(uint16_t maxMessages) {
|
|
260
|
+
maxTrackedMessages = maxMessages;
|
|
261
|
+
|
|
262
|
+
// Enforce new limit if needed
|
|
263
|
+
while (trackedMessages.size() > maxTrackedMessages) {
|
|
264
|
+
enforceMemoryLimit();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Set a new timeout value
|
|
270
|
+
* @param timeoutMs New timeout in milliseconds
|
|
271
|
+
*/
|
|
272
|
+
void setTimeoutMs(uint32_t timeoutMs) {
|
|
273
|
+
messageTimeoutMs = timeoutMs;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
private:
|
|
277
|
+
std::map<MessageKey, TrackedMessage> trackedMessages;
|
|
278
|
+
uint16_t maxTrackedMessages;
|
|
279
|
+
uint32_t messageTimeoutMs;
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Enforce memory limit by removing the oldest entry
|
|
283
|
+
* @return true if an entry was removed, false if tracker was empty
|
|
284
|
+
*/
|
|
285
|
+
bool enforceMemoryLimit() {
|
|
286
|
+
if (trackedMessages.empty()) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Find the oldest entry
|
|
291
|
+
auto oldest = trackedMessages.begin();
|
|
292
|
+
uint32_t oldestTimestamp = oldest->second.timestamp;
|
|
293
|
+
|
|
294
|
+
for (auto it = trackedMessages.begin(); it != trackedMessages.end(); ++it) {
|
|
295
|
+
if (it->second.timestamp < oldestTimestamp) {
|
|
296
|
+
oldest = it;
|
|
297
|
+
oldestTimestamp = it->second.timestamp;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
Log(logger::GENERAL, "MessageTracker: Evicting oldest entry (msg=%u, node=%u) to enforce limit\n",
|
|
302
|
+
oldest->first.messageId, oldest->first.originNode);
|
|
303
|
+
|
|
304
|
+
trackedMessages.erase(oldest);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
} // namespace painlessmesh
|
|
310
|
+
|
|
311
|
+
#endif // _PAINLESS_MESH_MESSAGE_TRACKER_HPP_
|
|
@@ -56,6 +56,12 @@ constexpr int BRIDGE_ELECTION = 611; // Bridge election candidacy announcemen
|
|
|
56
56
|
constexpr int BRIDGE_TAKEOVER = 612; // Bridge takeover notification
|
|
57
57
|
constexpr int BRIDGE_COORDINATION = 613; // Multi-bridge coordination (defined in plugin.hpp)
|
|
58
58
|
|
|
59
|
+
// Gateway data protocol types
|
|
60
|
+
// Used for routing Internet requests through the mesh network
|
|
61
|
+
constexpr int GATEWAY_DATA = 620; // Gateway data package for Internet routing
|
|
62
|
+
constexpr int GATEWAY_ACK = 621; // Gateway acknowledgment package
|
|
63
|
+
constexpr int GATEWAY_HEARTBEAT = 622; // Gateway heartbeat for health monitoring
|
|
64
|
+
|
|
59
65
|
class PackageInterface {
|
|
60
66
|
public:
|
|
61
67
|
virtual JsonObject addTo(JsonObject&& jsonObj) const = 0;
|
package/DOCUMENTATION_INDEX.md
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
# AlteriomPainlessMesh Documentation Index
|
|
2
|
-
|
|
3
|
-
Complete guide to finding documentation in the AlteriomPainlessMesh library.
|
|
4
|
-
|
|
5
|
-
## Quick Links
|
|
6
|
-
|
|
7
|
-
- 🌐 **[Online Documentation](https://alteriom.github.io/painlessMesh/)** - Interactive documentation website
|
|
8
|
-
- 📖 **[API Reference](https://alteriom.github.io/painlessMesh/#/api/doxygen)** - Complete API documentation
|
|
9
|
-
- 🎯 **[Examples](https://alteriom.github.io/painlessMesh/#/tutorials/basic-examples)** - Code examples and tutorials
|
|
10
|
-
|
|
11
|
-
## Core Documentation
|
|
12
|
-
|
|
13
|
-
### Getting Started
|
|
14
|
-
- **[README.md](README.md)** - Project overview, features, and quick start
|
|
15
|
-
- **[docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)** - Quick start guide
|
|
16
|
-
- **[docs/getting-started/installation.md](docs/getting-started/installation.md)** - Installation instructions
|
|
17
|
-
- **[docs/getting-started/first-mesh.md](docs/getting-started/first-mesh.md)** - Your first mesh network
|
|
18
|
-
|
|
19
|
-
### Release Information
|
|
20
|
-
- **[CHANGELOG.md](CHANGELOG.md)** - Complete version history
|
|
21
|
-
- **[RELEASE_GUIDE.md](RELEASE_GUIDE.md)** - Release process for maintainers
|
|
22
|
-
- **[RELEASE_NOTES_1.8.12.md](RELEASE_NOTES_1.8.12.md)** - Latest release notes
|
|
23
|
-
- **[RELEASE_CHECKLIST_1.8.12.md](RELEASE_CHECKLIST_1.8.12.md)** - Release checklist
|
|
24
|
-
|
|
25
|
-
### Contributing
|
|
26
|
-
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - How to contribute to the project
|
|
27
|
-
- **[LICENSE](LICENSE)** - LGPL-3.0 license terms
|
|
28
|
-
|
|
29
|
-
## Technical Documentation
|
|
30
|
-
|
|
31
|
-
### Alteriom Extensions
|
|
32
|
-
- **[docs/alteriom/overview.md](docs/alteriom/overview.md)** - Alteriom extensions overview
|
|
33
|
-
- **[examples/alteriom/README.md](examples/alteriom/README.md)** - Alteriom package documentation
|
|
34
|
-
- **[examples/alteriom/alteriom_sensor_package.hpp](examples/alteriom/alteriom_sensor_package.hpp)** - Package definitions with extensive inline documentation
|
|
35
|
-
|
|
36
|
-
### MQTT Integration
|
|
37
|
-
- **[docs/MQTT_BRIDGE_COMMANDS.md](docs/MQTT_BRIDGE_COMMANDS.md)** - MQTT command API
|
|
38
|
-
- **[docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md](docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md)** - Implementation details
|
|
39
|
-
- **[docs/MQTT_SCHEMA_COMPLIANCE.md](docs/MQTT_SCHEMA_COMPLIANCE.md)** - Schema validation
|
|
40
|
-
- **[docs/OTA_COMMANDS_REFERENCE.md](docs/OTA_COMMANDS_REFERENCE.md)** - OTA update commands
|
|
41
|
-
|
|
42
|
-
### Advanced Features
|
|
43
|
-
- **[docs/MESH_TOPOLOGY_GUIDE.md](docs/MESH_TOPOLOGY_GUIDE.md)** - Network topology reporting
|
|
44
|
-
- **[docs/BRIDGE_FAILOVER.md](docs/BRIDGE_FAILOVER.md)** - Bridge failover documentation
|
|
45
|
-
- **[docs/BRIDGE_HEALTH_MONITORING.md](docs/BRIDGE_HEALTH_MONITORING.md)** - Bridge health monitoring
|
|
46
|
-
- **[BRIDGE_TO_INTERNET.md](BRIDGE_TO_INTERNET.md)** - Connecting mesh to internet
|
|
47
|
-
|
|
48
|
-
### Development
|
|
49
|
-
- **[docs/API_DESIGN_GUIDELINES.md](docs/API_DESIGN_GUIDELINES.md)** - API design patterns
|
|
50
|
-
- **[docs/VERSION_MANAGEMENT.md](docs/VERSION_MANAGEMENT.md)** - Version management guide
|
|
51
|
-
- **[docs/development/DOCKER_TESTING.md](docs/development/DOCKER_TESTING.md)** - Docker testing guide
|
|
52
|
-
- **[docs/development/TESTING_SUMMARY.md](docs/development/TESTING_SUMMARY.md)** - Test suite overview
|
|
53
|
-
- **[docs/development/ARDUINO_COMPLIANCE_SUMMARY.md](docs/development/ARDUINO_COMPLIANCE_SUMMARY.md)** - Arduino standards
|
|
54
|
-
|
|
55
|
-
### Phase Documentation
|
|
56
|
-
- **[docs/PHASE1_GUIDE.md](docs/PHASE1_GUIDE.md)** - Phase 1 features (v1.6.x)
|
|
57
|
-
- **[docs/PHASE2_GUIDE.md](docs/PHASE2_GUIDE.md)** - Phase 2 features (v1.7.x+)
|
|
58
|
-
- **[docs/releases/FEATURE_HISTORY.md](docs/releases/FEATURE_HISTORY.md)** - Consolidated feature history
|
|
59
|
-
|
|
60
|
-
## Example Code
|
|
61
|
-
|
|
62
|
-
### Basic Examples
|
|
63
|
-
- **[examples/basic/](examples/basic/)** - Basic mesh networking
|
|
64
|
-
- **[examples/startHere/](examples/startHere/)** - Simple starting point
|
|
65
|
-
|
|
66
|
-
### Alteriom Examples
|
|
67
|
-
- **[examples/alteriom/](examples/alteriom/)** - Core Alteriom package examples
|
|
68
|
-
- **[examples/alteriomSensorNode/](examples/alteriomSensorNode/)** - Sensor node implementation
|
|
69
|
-
- **[examples/alteriomImproved/](examples/alteriomImproved/)** - Enhanced sensor node
|
|
70
|
-
- **[examples/alteriomMetricsHealth/](examples/alteriomMetricsHealth/)** - Metrics and health monitoring
|
|
71
|
-
- **[examples/alteriomPhase1/](examples/alteriomPhase1/)** - Phase 1 features demo
|
|
72
|
-
- **[examples/alteriomPhase2/](examples/alteriomPhase2/)** - Phase 2 features demo
|
|
73
|
-
|
|
74
|
-
### Bridge Examples
|
|
75
|
-
- **[examples/bridge/](examples/bridge/)** - Basic bridge examples
|
|
76
|
-
- **[examples/bridge_failover/](examples/bridge_failover/)** - Bridge failover implementation
|
|
77
|
-
- **[examples/multi_bridge/](examples/multi_bridge/)** - Multiple bridge setup
|
|
78
|
-
- **[examples/bridgeAwareSensorNode/](examples/bridgeAwareSensorNode/)** - Bridge-aware nodes
|
|
79
|
-
|
|
80
|
-
### MQTT Examples
|
|
81
|
-
- **[examples/mqttBridge/](examples/mqttBridge/)** - MQTT bridge
|
|
82
|
-
- **[examples/mqttCommandBridge/](examples/mqttCommandBridge/)** - Command bridge
|
|
83
|
-
- **[examples/mqttStatusBridge/](examples/mqttStatusBridge/)** - Status reporting bridge
|
|
84
|
-
- **[examples/mqttTopologyTest/](examples/mqttTopologyTest/)** - Topology testing
|
|
85
|
-
|
|
86
|
-
### Advanced Examples
|
|
87
|
-
- **[examples/otaReceiver/](examples/otaReceiver/)** - OTA update receiver
|
|
88
|
-
- **[examples/otaSender/](examples/otaSender/)** - OTA update sender
|
|
89
|
-
- **[examples/ntpTimeSyncBridge/](examples/ntpTimeSyncBridge/)** - NTP time sync bridge
|
|
90
|
-
- **[examples/ntpTimeSyncNode/](examples/ntpTimeSyncNode/)** - NTP time sync node
|
|
91
|
-
- **[examples/webServer/](examples/webServer/)** - Mesh web server
|
|
92
|
-
- **[examples/diagnosticsExample/](examples/diagnosticsExample/)** - Diagnostics tools
|
|
93
|
-
|
|
94
|
-
## Troubleshooting
|
|
95
|
-
|
|
96
|
-
- **[docs/troubleshooting/common-issues.md](docs/troubleshooting/common-issues.md)** - Common problems and solutions
|
|
97
|
-
- **[docs/troubleshooting/ESP32_C6_COMPATIBILITY.md](docs/troubleshooting/ESP32_C6_COMPATIBILITY.md)** - ESP32-C6 issues
|
|
98
|
-
- **[docs/troubleshooting/debugging.md](docs/troubleshooting/debugging.md)** - Debugging techniques
|
|
99
|
-
- **[docs/troubleshooting/faq.md](docs/troubleshooting/faq.md)** - Frequently asked questions
|
|
100
|
-
|
|
101
|
-
## Architecture Documentation
|
|
102
|
-
|
|
103
|
-
- **[docs/architecture/mesh-architecture.md](docs/architecture/mesh-architecture.md)** - Mesh architecture overview
|
|
104
|
-
- **[docs/architecture/plugin-system.md](docs/architecture/plugin-system.md)** - Plugin architecture
|
|
105
|
-
- **[docs/architecture/routing.md](docs/architecture/routing.md)** - Message routing
|
|
106
|
-
- **[docs/architecture/time-sync.md](docs/architecture/time-sync.md)** - Time synchronization
|
|
107
|
-
|
|
108
|
-
## Support & Community
|
|
109
|
-
|
|
110
|
-
### Getting Help
|
|
111
|
-
- **GitHub Issues**: https://github.com/Alteriom/painlessMesh/issues
|
|
112
|
-
- **GitHub Discussions**: https://github.com/Alteriom/painlessMesh/discussions
|
|
113
|
-
|
|
114
|
-
### Package Registries
|
|
115
|
-
- **NPM**: https://www.npmjs.com/package/@alteriom/painlessmesh
|
|
116
|
-
- **PlatformIO**: https://registry.platformio.org/libraries/alteriom/painlessMesh
|
|
117
|
-
- **Arduino Library Manager**: Search for "AlteriomPainlessMesh"
|
|
118
|
-
|
|
119
|
-
## Version-Specific Documentation
|
|
120
|
-
|
|
121
|
-
### Current Version (1.8.12)
|
|
122
|
-
- Focus on documentation improvements and code quality
|
|
123
|
-
- Added prettier configuration for consistent formatting
|
|
124
|
-
- Enhanced inline documentation
|
|
125
|
-
- See [RELEASE_NOTES_1.8.12.md](RELEASE_NOTES_1.8.12.md) for details
|
|
126
|
-
|
|
127
|
-
### Previous Versions
|
|
128
|
-
- **v1.8.11** - Bridge discovery and Windows MSVC compatibility fixes
|
|
129
|
-
- **v1.8.10** - Bridge status direct messaging improvements
|
|
130
|
-
- **v1.8.9** - Bridge self-registration fixes
|
|
131
|
-
- **v1.8.0** - Bridge failover introduction
|
|
132
|
-
- **v1.7.0** - Phase 2 features (broadcast OTA, MQTT status bridge)
|
|
133
|
-
- **v1.6.0** - Phase 1 features (Alteriom packages)
|
|
134
|
-
|
|
135
|
-
See [CHANGELOG.md](CHANGELOG.md) for complete version history.
|
|
136
|
-
|
|
137
|
-
## Contributing to Documentation
|
|
138
|
-
|
|
139
|
-
To contribute to documentation:
|
|
140
|
-
1. Follow the style guide in existing documentation
|
|
141
|
-
2. Update this index when adding new documentation files
|
|
142
|
-
3. Ensure all links are functional
|
|
143
|
-
4. Use Markdown for all documentation
|
|
144
|
-
5. Include code examples where appropriate
|
|
145
|
-
|
|
146
|
-
For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|