@alteriom/painlessmesh 1.8.15 → 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 +61 -1
  3. package/CONTRIBUTING.md +79 -0
  4. package/README.md +69 -144
  5. package/docs/README.md +1 -0
  6. package/docs/api/shared-gateway.md +1207 -0
  7. package/examples/bridge_failover/README.md +81 -0
  8. package/examples/bridge_failover/bridge_failover.ino +35 -4
  9. package/examples/sharedGateway/README.md +235 -0
  10. package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
  11. package/examples/sharedGateway/sharedGateway.ino +303 -0
  12. package/library.json +3 -22
  13. package/library.properties +1 -1
  14. package/package.json +3 -6
  15. package/src/arduino/wifi.hpp +342 -4
  16. package/src/painlessmesh/gateway.hpp +2120 -0
  17. package/src/painlessmesh/mesh.hpp +1034 -6
  18. package/src/painlessmesh/message_tracker.hpp +311 -0
  19. package/src/painlessmesh/protocol.hpp +6 -0
  20. package/DOCUMENTATION_INDEX.md +0 -146
  21. package/RELEASE_NOTES_1.8.15.md +0 -160
  22. package/RELEASE_READINESS_PLAN.md +0 -323
  23. package/TESTING_WITH_SIMULATOR.md +0 -259
  24. package/docs/API_DESIGN_GUIDELINES.md +0 -414
  25. package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
  26. package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
  27. package/docs/BRIDGE_FAILOVER.md +0 -512
  28. package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
  29. package/docs/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
  30. package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
  31. package/docs/CREATE_MISSING_RELEASES.md +0 -321
  32. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
  33. package/docs/FAQ_VERSION_NUMBERS.md +0 -152
  34. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
  35. package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
  36. package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
  37. package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
  38. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
  39. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
  40. package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
  41. package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
  42. package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
  43. package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
  44. package/docs/PHASE1_GUIDE.md +0 -349
  45. package/docs/PHASE2_GUIDE.md +0 -543
  46. package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
  47. package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
  48. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
  49. package/docs/SIMULATOR_TESTING.md +0 -408
  50. package/docs/VERSION_MANAGEMENT.md +0 -213
  51. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
  52. package/docs/archive/FEATURE_PROPOSALS.md +0 -337
  53. package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
  54. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
  55. package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
  56. package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
  57. package/docs/archive/RELEASE_SUMMARY.md +0 -173
  58. package/docs/archive/SCONS_BUILD_FIX.md +0 -313
  59. package/docs/archive/TRIGGER_RELEASE.md +0 -280
  60. package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
  61. package/docs/archive/ota-and-status-enhancements.md +0 -911
  62. package/docs/archive/ota-status-architecture-diagrams.md +0 -658
  63. package/docs/archive/ota-status-quick-reference.md +0 -284
  64. package/docs/design/.gitkeep +0 -1
  65. package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
  66. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
  67. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
  68. package/docs/development/DOCKER_TESTING.md +0 -196
  69. package/docs/development/PLATFORMIO_USAGE.md +0 -180
  70. package/docs/development/TESTING_SUMMARY.md +0 -126
  71. package/docs/development/contributing.md +0 -301
  72. package/docs/development/documentation.md +0 -583
  73. package/docs/features/DIAGNOSTICS_API.md +0 -534
  74. package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
  75. package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
  76. package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
  77. package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
  78. package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
  79. package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
  80. package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
  81. package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
  82. package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
  83. package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
  84. package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
  85. package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
  86. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
  87. package/docs/improvements/README.md +0 -212
  88. package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
  89. package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
  90. package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
  91. package/docs/internal/ISSUE_66_STATUS.md +0 -316
  92. package/docs/internal/PR_SUMMARY.md +0 -315
  93. package/docs/internal/REVIEW_SUMMARY.md +0 -332
  94. package/docs/multi-bridge-setup.md +0 -1025
  95. package/docs/platformio-publishing.md +0 -255
  96. package/docs/platformio-setup-summary.md +0 -121
  97. package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
  98. package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
  99. package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
  100. package/docs/releases/FEATURE_HISTORY.md +0 -543
  101. package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
  102. package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
  103. package/docs/releases/PATCH_v1.7.2.md +0 -262
  104. package/docs/releases/PATCH_v1.7.3.md +0 -262
  105. package/docs/releases/PATCH_v1.7.4.md +0 -219
  106. package/docs/releases/PHASE1_SUMMARY.md +0 -246
  107. package/docs/releases/PHASE2_SUMMARY.md +0 -499
  108. package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
  109. package/docs/releases/QUICK_START_RELEASES.md +0 -113
  110. package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
  111. package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
  112. package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
  113. package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
  114. package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
  115. package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
  116. package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
  117. package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
  118. package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
  119. package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
  120. package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
  121. package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
  122. package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
  123. package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
  124. package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
  125. package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
  126. package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
  127. package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
  128. package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
  129. package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
  130. package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
  131. package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
  132. package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
  133. package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
  134. package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
  135. package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
  136. package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
  137. package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
  138. package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
  139. package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
  140. package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
  141. package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
  142. package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
  143. package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
  144. package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
  145. package/docs/troubleshooting/common-architecture-mistakes.md +0 -438
  146. package/docs/troubleshooting/internet-access-faq.md +0 -299
  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 -108
  197. package/examples/multi_bridge/regular_node.ino +0 -141
  198. package/examples/multi_bridge/secondary_bridge.ino +0 -123
  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).
@@ -1,160 +0,0 @@
1
- # Release Notes v1.8.15
2
-
3
- **Release Date**: November 23, 2025
4
-
5
- ## Overview
6
-
7
- This release integrates the painlessMesh-simulator for automated validation of example sketches, providing a comprehensive testing framework that validates mesh behavior with virtual nodes. This enhances the library's quality assurance and helps prevent regressions.
8
-
9
- ## What's New
10
-
11
- ### Simulator Integration
12
-
13
- **Automated Example Validation**
14
- - Integrated [painlessMesh-simulator](https://github.com/Alteriom/painlessMesh-simulator) as git submodule
15
- - YAML-based test scenarios for configuration-driven testing
16
- - Validates mesh formation, message broadcasting, and time synchronization
17
- - Runs automatically in CI/CD pipeline on every push and pull request
18
- - Framework supports testing with 100+ virtual nodes without hardware
19
-
20
- **Test Coverage**
21
- - Basic example validation with 5 virtual nodes
22
- - Mesh formation verification (30 second timeout)
23
- - Message delivery validation (5+ messages per node)
24
- - Time synchronization testing (<10ms drift)
25
- - Network metrics collection (CSV output)
26
-
27
- ### Documentation
28
-
29
- **New Documentation**
30
- - `RELEASE_READINESS_PLAN.md` - Comprehensive library audit and release assessment
31
- - `TESTING_WITH_SIMULATOR.md` - Quick start guide for using the simulator
32
- - `docs/SIMULATOR_TESTING.md` - Complete integration guide with CI details
33
- - `examples/basic/test/simulator/README.md` - Example-specific testing instructions
34
-
35
- **Release Assessment**
36
- - Confirmed all 119+ test assertions passing
37
- - Security scans passing (CodeQL)
38
- - Builds verified on all platforms (ESP8266, ESP32, Desktop)
39
- - Production-ready confirmation from maintainer
40
-
41
- ## Improvements
42
-
43
- ### CI/CD Pipeline
44
-
45
- **Enhanced Automation**
46
- - New `simulator-tests` job runs on every commit
47
- - Automatically builds simulator and executes test scenarios
48
- - Uploads test results as artifacts for debugging
49
- - 120-second timeout to prevent hanging
50
- - Integrated with existing CI jobs (desktop, Arduino, PlatformIO builds)
51
-
52
- ### Build System
53
-
54
- **Dependencies**
55
- - Added libboost-program-options-dev for simulator build
56
- - Updated all documentation with correct dependency lists
57
- - Fixed CMakeLists.txt references to removed test files
58
-
59
- ## Bug Fixes
60
-
61
- - Fixed build system references to deleted example test files
62
- - Corrected simulator executable path in CI configuration
63
- - Fixed YAML configuration format to match simulator API
64
-
65
- ## Breaking Changes
66
-
67
- None. This release is fully backward compatible.
68
-
69
- ## Upgrade Instructions
70
-
71
- ### For End Users
72
-
73
- No action required. This is a fully backward-compatible release focused on testing infrastructure improvements.
74
-
75
- ### For Contributors/Developers
76
-
77
- If you want to run simulator tests locally:
78
-
79
- ```bash
80
- # Initialize simulator submodule
81
- git submodule update --init test/simulator
82
-
83
- # Install dependencies (Ubuntu/Debian)
84
- sudo apt-get install cmake ninja-build libboost-dev libboost-program-options-dev libyaml-cpp-dev
85
-
86
- # Build simulator
87
- cd test/simulator && mkdir build && cd build
88
- cmake -G Ninja .. && ninja
89
-
90
- # Run basic example test
91
- bin/painlessmesh-simulator --config \
92
- ../../../examples/basic/test/simulator/scenarios/basic_mesh_test.yaml
93
- ```
94
-
95
- ## Test Results
96
-
97
- **Library Tests**: ✅ ALL PASSING
98
- ```
99
- ✓ catch_tcp_integration - 113 assertions
100
- ✓ catch_connection - 6 assertions
101
- ✓ 30+ unit tests - router, bridge, messaging, etc.
102
- ✓ Simulator basic test - 5 nodes, mesh formation validated
103
-
104
- Total: 119+ assertions, ALL PASSING
105
- ```
106
-
107
- **Security**: ✅ CodeQL passing, no alerts
108
-
109
- **Builds**: ✅ Desktop, Arduino, PlatformIO, ESP8266, ESP32
110
-
111
- ## Known Issues
112
-
113
- None identified. See [GitHub Issues](https://github.com/Alteriom/painlessMesh/issues) for any reports.
114
-
115
- ## Migration Guide
116
-
117
- No migration required. This release is fully backward compatible with v1.8.14 and earlier.
118
-
119
- ## Contributors
120
-
121
- This release was made possible by:
122
- - **@Alteriom** - Simulator integration, testing infrastructure, documentation
123
- - **GitHub Copilot** - Development assistance and code review
124
- - **Community Contributors** - Issue reports and feedback
125
-
126
- ## Next Steps
127
-
128
- ### Future Enhancements
129
-
130
- **Expanded Test Coverage**
131
- - Additional simulator scenarios for remaining examples (startHere, echoNode, bridge, MQTT)
132
- - Extended test coverage with edge cases (network failures, packet loss, etc.)
133
- - Performance benchmarking with 100+ node simulations
134
-
135
- **Custom Firmware**
136
- - Contributors can add custom firmware types to painlessMesh-simulator
137
- - Pattern established for testing custom mesh behaviors
138
- - Documentation for extending simulator capabilities
139
-
140
- ## Links
141
-
142
- - [GitHub Release](https://github.com/Alteriom/painlessMesh/releases/tag/v1.8.15)
143
- - [Full Changelog](https://github.com/Alteriom/painlessMesh/blob/main/CHANGELOG.md)
144
- - [Issue #163 - Improve validation](https://github.com/Alteriom/painlessMesh/issues/163)
145
- - [Pull Request #164](https://github.com/Alteriom/painlessMesh/pull/164)
146
- - [painlessMesh-simulator Repository](https://github.com/Alteriom/painlessMesh-simulator)
147
- - [Documentation](https://github.com/Alteriom/painlessMesh/blob/main/DOCUMENTATION_INDEX.md)
148
-
149
- ## Support
150
-
151
- For questions or issues:
152
- - GitHub Issues: https://github.com/Alteriom/painlessMesh/issues
153
- - Documentation: https://github.com/Alteriom/painlessMesh/blob/main/README.md
154
- - Release Guide: https://github.com/Alteriom/painlessMesh/blob/main/RELEASE_GUIDE.md
155
-
156
- ---
157
-
158
- **Thank you for using AlteriomPainlessMesh!**
159
-
160
- This release represents a significant step forward in ensuring library quality through automated testing. We're committed to maintaining high standards and appreciate the community's continued support.