@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.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +61 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +69 -144
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +35 -4
- 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 -6
- package/src/arduino/wifi.hpp +342 -4
- 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/RELEASE_NOTES_1.8.15.md +0 -160
- package/RELEASE_READINESS_PLAN.md +0 -323
- package/TESTING_WITH_SIMULATOR.md +0 -259
- 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/BRIDGE_INITIALIZATION_FALLBACK.md +0 -357
- 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/SIMULATOR_TESTING.md +0 -408
- 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/common-architecture-mistakes.md +0 -438
- package/docs/troubleshooting/internet-access-faq.md +0 -299
- 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 -108
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -123
- 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).
|
package/RELEASE_NOTES_1.8.15.md
DELETED
|
@@ -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.
|