@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.
Files changed (208) hide show
  1. package/BRIDGE_TO_INTERNET.md +229 -0
  2. package/CHANGELOG.md +89 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +70 -143
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/docs/troubleshooting/common-issues.md +28 -0
  8. package/docs/troubleshooting/faq.md +113 -12
  9. package/examples/basic/test/simulator/CMakeLists.txt +40 -0
  10. package/examples/basic/test/simulator/README.md +149 -0
  11. package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
  12. package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
  13. package/examples/bridge/bridge.ino +17 -4
  14. package/examples/bridge_failover/README.md +81 -0
  15. package/examples/bridge_failover/bridge_failover.ino +51 -6
  16. package/examples/sharedGateway/README.md +235 -0
  17. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  18. package/examples/sharedGateway/sharedGateway.ino +303 -0
  19. package/library.json +3 -22
  20. package/library.properties +1 -1
  21. package/package.json +3 -3
  22. package/src/arduino/wifi.hpp +380 -13
  23. package/src/painlessmesh/gateway.hpp +2120 -0
  24. package/src/painlessmesh/mesh.hpp +1034 -6
  25. package/src/painlessmesh/message_tracker.hpp +311 -0
  26. package/src/painlessmesh/protocol.hpp +6 -0
  27. package/DOCUMENTATION_INDEX.md +0 -146
  28. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  29. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  30. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  31. package/docs/BRIDGE_FAILOVER.md +0 -512
  32. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  33. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  34. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  35. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  36. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  37. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  38. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  39. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  40. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  41. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  42. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  43. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  44. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  45. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  46. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  47. package/docs/PHASE1_GUIDE.md +0 -349
  48. package/docs/PHASE2_GUIDE.md +0 -543
  49. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  50. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  51. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  52. package/docs/VERSION_MANAGEMENT.md +0 -213
  53. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  54. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  55. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  56. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  57. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  58. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  59. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  60. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  61. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  62. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  63. package/docs/archive/ota-and-status-enhancements.md +0 -911
  64. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  65. package/docs/archive/ota-status-quick-reference.md +0 -284
  66. package/docs/design/.gitkeep +0 -1
  67. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  68. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  69. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  70. package/docs/development/DOCKER_TESTING.md +0 -196
  71. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  72. package/docs/development/TESTING_SUMMARY.md +0 -126
  73. package/docs/development/contributing.md +0 -301
  74. package/docs/development/documentation.md +0 -583
  75. package/docs/features/DIAGNOSTICS_API.md +0 -534
  76. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  77. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  78. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  79. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  80. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  81. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  82. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  83. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  84. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  85. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  86. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  87. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  88. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  89. package/docs/improvements/README.md +0 -212
  90. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  91. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  92. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  93. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  94. package/docs/internal/PR_SUMMARY.md +0 -315
  95. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  96. package/docs/multi-bridge-setup.md +0 -1025
  97. package/docs/platformio-publishing.md +0 -255
  98. package/docs/platformio-setup-summary.md +0 -121
  99. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  100. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  101. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  102. package/docs/releases/FEATURE_HISTORY.md +0 -543
  103. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  104. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  105. package/docs/releases/PATCH_v1.7.2.md +0 -262
  106. package/docs/releases/PATCH_v1.7.3.md +0 -262
  107. package/docs/releases/PATCH_v1.7.4.md +0 -219
  108. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  109. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  110. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  111. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  112. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  113. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  115. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  116. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  117. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  118. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  119. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  120. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  121. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  122. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  123. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  124. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  125. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  126. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  127. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  128. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  129. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  130. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  135. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  136. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  137. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  138. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  139. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  140. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  141. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  142. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  143. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  144. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  145. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  146. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  147. package/docs/troubleshooting/station-reconnection-issues.md +0 -172
  148. package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
  149. package/docs/wiki/API-Reference.md +0 -246
  150. package/docs/wiki/Complete-Documentation.md +0 -123
  151. package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
  152. package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
  153. package/examples/alteriomImproved/platformio.ini +0 -32
  154. package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
  155. package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
  156. package/examples/alteriomMetricsHealth/platformio.ini +0 -26
  157. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
  158. package/examples/alteriomPhase1/phase1_features.ino +0 -242
  159. package/examples/alteriomPhase1/platformio.ini +0 -26
  160. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
  161. package/examples/alteriomPhase2/phase2_features.ino +0 -186
  162. package/examples/alteriomPhase2/platformio.ini +0 -26
  163. package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
  164. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
  165. package/examples/alteriomSensorNode/platformio.ini +0 -26
  166. package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
  167. package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
  168. package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
  169. package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
  170. package/examples/bridge/mesh_event_publisher.hpp +0 -253
  171. package/examples/bridge/mesh_topology_reporter.hpp +0 -303
  172. package/examples/bridge/mqtt_command_bridge.hpp +0 -459
  173. package/examples/bridge/mqtt_status_bridge.hpp +0 -519
  174. package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
  175. package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
  176. package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
  177. package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
  178. package/examples/diagnosticsExample/platformio.ini +0 -26
  179. package/examples/echoNode/echoNode.ino +0 -33
  180. package/examples/echoNode/platformio.ini +0 -26
  181. package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
  182. package/examples/meshCommandNode/meshCommandNode.ino +0 -265
  183. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
  184. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
  185. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
  186. package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
  187. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
  188. package/examples/mqttCommandBridge/platformio.ini +0 -27
  189. package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
  190. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
  191. package/examples/mqttStatusBridge/platformio.ini +0 -27
  192. package/examples/mqttTopologyTest/README.md +0 -467
  193. package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
  194. package/examples/mqttTopologyTest/platformio.ini +0 -27
  195. package/examples/multi_bridge/README.md +0 -346
  196. package/examples/multi_bridge/primary_bridge.ino +0 -96
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -111
  199. package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
  200. package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
  201. package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
  202. package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
  203. package/examples/queued_alarms/README.md +0 -390
  204. package/examples/queued_alarms/queued_alarms.ino +0 -265
  205. package/examples/routing_demo/README.md +0 -172
  206. package/examples/routing_demo/routing_demo.ino +0 -102
  207. package/examples/rtcIntegration/README.md +0 -294
  208. 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;
@@ -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).