@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
@@ -1,264 +0,0 @@
1
- # Sensor Node Connection Crash - Action Plan
2
-
3
- ## ✅ STATUS: FIXED (October 19, 2025)
4
-
5
- **Fix Implemented:** Commit [7391717](https://github.com/Alteriom/painlessMesh/commit/7391717)
6
- **Released:** painlessMesh v1.7.4
7
- **Implementation:** See [FREERTOS_FIX_IMPLEMENTATION.md](FREERTOS_FIX_IMPLEMENTATION.md)
8
-
9
- The complete dual-approach fix (Option A + Option B) is now available in v1.7.4. Update to the latest version to automatically apply the fix when building for ESP32 platforms.
10
-
11
- **Installation:**
12
-
13
- - **PlatformIO:** `pio pkg update sparck75/AlteriomPainlessMesh`
14
- - **NPM:** `npm install @alteriom/painlessmesh@1.7.4`
15
- - **Arduino IDE:** Library Manager → Search "painlessMesh" → Update to 1.7.4
16
- - **GitHub:** [Release v1.7.4](https://github.com/Alteriom/painlessMesh/releases/tag/v1.7.4)
17
-
18
- ---
19
-
20
- ## Issue Summary
21
-
22
- **Symptom:** FreeRTOS assertion failure when sensor nodes connect to mesh
23
- **Error:** `assert failed: vTaskPriorityDisinheritAfterTimeout`
24
- **Platform:** ESP32 only (ESP8266 unaffected)
25
- **Scope:** painlessMesh library issue - NOT related to Build 8015 or Phase 2 changes
26
-
27
- **Important:** This is a known painlessMesh + AsyncTCP + FreeRTOS interaction issue that requires mesh library fixes, separate from your application code.
28
-
29
- ## Immediate Action Plan
30
-
31
- ### Step 1: Apply Quick Fix (Choose ONE)
32
-
33
- #### Option A: Increase Semaphore Timeout ⭐ RECOMMENDED FOR TESTING
34
-
35
- **Fastest fix - 5 minutes:**
36
-
37
- 1. **Edit:** `src/painlessmesh/mesh.hpp` line 544
38
- 2. **Change:** `(TickType_t)10` → `(TickType_t)100`
39
- 3. **Rebuild & Upload:** `pio run -t upload`
40
- 4. **Test:** Connect sensor nodes and monitor for crashes
41
-
42
- **Rationale:** Gives more time for semaphore acquisition, prevents timeout-related assertions.
43
-
44
- #### Option B: Enable Thread-Safe Scheduler ⭐ RECOMMENDED FOR PRODUCTION
45
-
46
- **Better long-term solution - 10 minutes:**
47
-
48
- 1. **Create:** `src/painlessTaskOptions.h` (if doesn't exist)
49
- ```cpp
50
- #ifndef _PAINLESS_TASK_OPTIONS_H_
51
- #define _PAINLESS_TASK_OPTIONS_H_
52
-
53
- #ifdef ESP32
54
- #define _TASK_THREAD_SAFE // FreeRTOS queue-based task control
55
- #define _TASK_PRIORITY // Priority scheduling support
56
- #endif
57
-
58
- #endif
59
- ```
60
-
61
- 2. **Modify:** Your main sketch BEFORE `#include <painlessMesh.h>`:
62
- ```cpp
63
- #include "painlessTaskOptions.h"
64
- #include <painlessMesh.h>
65
- ```
66
-
67
- 3. **Rebuild & Upload**
68
-
69
- **Rationale:** Uses FreeRTOS queue for thread-safe task management, eliminates race conditions.
70
-
71
- ### Step 2: Monitor & Verify
72
-
73
- Add this monitoring code to track connection health:
74
-
75
- ```cpp
76
- void setup() {
77
- Serial.begin(115200);
78
-
79
- // Enable mesh debugging
80
- mesh.setDebugMsgTypes(ERROR | STARTUP | CONNECTION);
81
-
82
- // Connection monitoring
83
- mesh.onNewConnection([](uint32_t nodeId) {
84
- Serial.printf("[MONITOR] Node connected: %u\n", nodeId);
85
- Serial.printf(" Free heap: %d bytes\n", ESP.getFreeHeap());
86
- Serial.printf(" Min heap: %d bytes\n", ESP.getMinFreeHeap());
87
- Serial.printf(" Stack HWM: %d bytes\n", uxTaskGetStackHighWaterMark(NULL));
88
- Serial.printf(" Total nodes: %d\n", mesh.getNodeList().size() + 1);
89
- });
90
-
91
- mesh.onDroppedConnection([](uint32_t nodeId, bool isStation) {
92
- Serial.printf("[MONITOR] Node dropped: %u (station=%d)\n", nodeId, isStation);
93
- });
94
- }
95
-
96
- void loop() {
97
- mesh.update();
98
-
99
- // Periodic health check every 30 seconds
100
- static uint32_t lastCheck = 0;
101
- if (millis() - lastCheck > 30000) {
102
- lastCheck = millis();
103
- Serial.printf("[HEALTH] Heap: %d, Min: %d, Stack: %d, Nodes: %d\n",
104
- ESP.getFreeHeap(),
105
- ESP.getMinFreeHeap(),
106
- uxTaskGetStackHighWaterMark(NULL),
107
- mesh.getNodeList().size() + 1);
108
- }
109
- }
110
- ```
111
-
112
- ### Step 3: Test Scenarios
113
-
114
- **Critical Test Cases:**
115
-
116
- 1. **Single Node Connection**
117
- - Start gateway
118
- - Connect 1 sensor node
119
- - Verify: No crash, stable connection
120
-
121
- 2. **Multiple Simultaneous Connections**
122
- - Start gateway
123
- - Power on 3-5 sensor nodes simultaneously
124
- - Verify: All connect without crashes
125
-
126
- 3. **Rapid Connect/Disconnect**
127
- - Connect sensor node
128
- - Wait 10 seconds
129
- - Power cycle sensor
130
- - Repeat 10 times
131
- - Verify: No cumulative issues or crashes
132
-
133
- 4. **Sustained Operation**
134
- - Run mesh network for 1+ hour
135
- - Monitor free heap and stack
136
- - Verify: No memory leaks or gradual degradation
137
-
138
- ### Step 4: Collect Diagnostic Data
139
-
140
- If crashes persist after applying fixes, collect:
141
-
142
- ```cpp
143
- // Enable detailed FreeRTOS logging
144
- #define CORE_DEBUG_LEVEL 5 // Verbose
145
-
146
- // In platformio.ini
147
- build_flags =
148
- -DCORE_DEBUG_LEVEL=5
149
- -DCONFIG_FREERTOS_ASSERT_FAIL_ABORT=0 // Don't abort on assert
150
- -DCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=1
151
- ```
152
-
153
- **Capture:**
154
- - Full serial output during crash
155
- - Heap/stack watermarks before crash
156
- - Number of connected nodes at crash time
157
- - WiFi RSSI values
158
- - Mesh topology (node IDs and connections)
159
-
160
- ## Root Cause Analysis
161
-
162
- **Why This Happens:**
163
-
164
- 1. **AsyncTCP** uses FreeRTOS mutexes internally for WiFi callbacks
165
- 2. **painlessMesh** uses its own mutex (`xSemaphore`) for mesh operations
166
- 3. **TaskScheduler** runs cooperative multitasking on top of FreeRTOS
167
- 4. When sensor connects:
168
- - WiFi callback fires (high priority FreeRTOS task)
169
- - Mesh code tries to acquire semaphore
170
- - 10ms timeout too short for WiFi operations
171
- - FreeRTOS tries to restore task priority after timeout
172
- - Priority inheritance state is inconsistent → ASSERTION FAILURE
173
-
174
- **Key Insight:** This is a timing/synchronization issue in the mesh library itself, not your sensor/gateway code.
175
-
176
- ## Long-Term Solutions (For Next Release)
177
-
178
- These require mesh library changes and should be tracked separately from Build 8015:
179
-
180
- ### 1. Implement Thread-Safe TaskScheduler (HIGH PRIORITY)
181
-
182
- **Status:** ⚠️ Requires painlessMesh library modification
183
- **Effort:** 2-4 hours
184
- **Impact:** Eliminates root cause
185
-
186
- **Implementation:**
187
- - Enable `_TASK_THREAD_SAFE` by default for ESP32 builds
188
- - Implement FreeRTOS queue for task control requests
189
- - Add proper mutex guards around critical sections
190
-
191
- **Files to modify:**
192
- - `src/painlessmesh/configuration.hpp` - Add `#define _TASK_THREAD_SAFE` for ESP32
193
- - `src/painlessmesh/mesh.hpp` - Update semaphore timeout to 100ms
194
- - Test with full suite
195
-
196
- ### 2. Replace Mutex with Binary Semaphore (MEDIUM PRIORITY)
197
-
198
- **Status:** ⚠️ Alternative approach
199
- **Effort:** 1 hour
200
- **Impact:** Reduces priority inheritance issues
201
-
202
- **Trade-off:** Loses priority inheritance protection (acceptable for mesh use case)
203
-
204
- ### 3. Add Connection Rate Limiting (LOW PRIORITY)
205
-
206
- **Status:** Workaround
207
- **Effort:** 30 minutes
208
- **Impact:** Prevents simultaneous connection storm
209
-
210
- ```cpp
211
- // In mesh.hpp - connection handling
212
- static uint32_t lastConnectionTime = 0;
213
- if (millis() - lastConnectionTime < 1000) {
214
- delay(100); // Rate limit connections
215
- }
216
- lastConnectionTime = millis();
217
- ```
218
-
219
- ## Integration with Build 8015
220
-
221
- **Important Separation:**
222
-
223
- | Aspect | Build 8015 (Phase 2) | Mesh Connection Crash |
224
- |--------|---------------------|----------------------|
225
- | **Scope** | MQTT command bridge, topology reporting | painlessMesh + FreeRTOS timing |
226
- | **Root Cause** | Application code | Library interaction issue |
227
- | **Testing** | Functional tests for commands | Stress tests for connections |
228
- | **Priority** | HIGH (feature delivery) | HIGH (stability) |
229
- | **Timeline** | Current sprint | Parallel investigation |
230
- | **Dependencies** | None on mesh fix | None on Build 8015 |
231
-
232
- **Recommendation:** Apply Quick Fix (Option A or B) immediately to unblock Build 8015 testing. Schedule library fix as separate work item.
233
-
234
- ## Success Criteria
235
-
236
- After applying fixes, you should observe:
237
-
238
- ✅ **Zero crashes** during sensor node connections
239
- ✅ **Stable memory** - no heap degradation over time
240
- ✅ **Fast connections** - nodes join within 5-10 seconds
241
- ✅ **No disconnects** - sustained connections for hours
242
- ✅ **Scales reliably** - supports 4-10 nodes depending on ESP32 model
243
-
244
- ## Related Documentation
245
-
246
- - [FREERTOS_ASSERTION_FAILURE.md](./FREERTOS_ASSERTION_FAILURE.md) - Complete technical analysis
247
- - [QUICK_FIX_FREERTOS.md](./QUICK_FIX_FREERTOS.md) - Emergency fixes reference
248
- - [TaskScheduler Thread Safety Example](../../test/TaskScheduler/examples/Scheduler_example30_THREAD_SAFE/) - Reference implementation
249
-
250
- ## Decision Log
251
-
252
- **Date:** 2025-10-19
253
- **Decision:** Apply Option A (timeout increase) for immediate testing
254
- **Rationale:** Fastest unblock for Build 8015 validation
255
- **Next Step:** Evaluate Option B for production deployment
256
- **Owner:** [Your Name]
257
- **Status:** 🟡 In Progress
258
-
259
- ---
260
-
261
- **Last Updated:** 2025-10-19
262
- **Severity:** HIGH (blocks production deployment)
263
- **Workaround Available:** YES (Option A/B)
264
- **Permanent Fix Required:** YES (library modification)
@@ -1,172 +0,0 @@
1
- # Station Reconnection Issues in Bridge Mode
2
-
3
- ## Problem Description
4
-
5
- When using `stationManual()` to create a bridge node that connects to a router while also maintaining a mesh network, users may experience issues where the station (router) connection drops during mesh initialization and fails to reconnect automatically.
6
-
7
- ### Symptoms
8
-
9
- - Initial connection to router succeeds
10
- - Mesh network initializes successfully
11
- - Station connection drops with `ARDUINO_EVENT_WIFI_STA_DISCONNECTED` events
12
- - Station never reconnects despite reconnection logic being triggered
13
- - Serial output shows repeated disconnect events without successful reconnection
14
-
15
- ### Example Serial Output
16
-
17
- ```
18
- === WiFi Connectivity Diagnostics ===
19
- Step 1: Connecting to router to detect channel...
20
- ✓ Successfully connected to router!
21
- Router Channel: 6 ← Auto-detected!
22
- Router IP: 192.168.18.11
23
-
24
- Step 2: Initializing mesh on channel 6...
25
- STARTUP: init(): 1
26
- STARTUP: init(): Mesh channel set to 6
27
- STARTUP: AP tcp server established on port 5555
28
- STARTUP: stationManual(): Connecting to MyRouter
29
- STARTUP: stationManual(): Connection initiated
30
- ✓ Mesh initialized
31
-
32
- Step 3: Waiting for station reconnection...
33
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
34
- CONNECTION: eraseClosedConnections():
35
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
36
- CONNECTION: eraseClosedConnections():
37
- ⚠ Station not connected yet (may connect later)
38
- ```
39
-
40
- ## Root Cause
41
-
42
- The issue was in the `connectToAP()` method in `src/painlessMeshSTA.cpp`. When operating in manual mode (for router connections via `stationManual()`):
43
-
44
- 1. Station disconnects during mesh initialization (normal behavior in AP+STA mode)
45
- 2. Disconnect callback triggers `yieldConnectToAP()` to reconnect
46
- 3. `connectToAP()` checks if router SSID is in the scan results
47
- 4. Router SSID is NOT in scan results (scan only looks for mesh nodes on mesh channel)
48
- 5. Function returns without calling `WiFi.begin()` to reconnect
49
- 6. Station remains disconnected indefinitely
50
-
51
- ### Code Analysis
52
-
53
- **Before Fix** (lines 192-195 in `painlessMeshSTA.cpp`):
54
-
55
- ```cpp
56
- } else if (aps.empty() || !ssid.equals(aps.begin()->ssid)) {
57
- task.enableDelayed(SCAN_INTERVAL);
58
- return; // ← Just delays, never attempts reconnection!
59
- }
60
- ```
61
-
62
- The problem: This conditional assumes the router SSID will appear in the `aps` list from `stationScan()`. However, `stationScan()` only scans on the mesh channel for mesh nodes, not for routers which may be on the same or different channel.
63
-
64
- ## Solution
65
-
66
- **After Fix** (v1.8.1+):
67
-
68
- ```cpp
69
- } else {
70
- // For manual router connections, reconnect directly using WiFi.begin()
71
- // Don't rely on scan results since router may be on different channel
72
- Log(CONNECTION,
73
- "connectToAP(): Manual connection - attempting to reconnect to %s\n",
74
- ssid.c_str());
75
- WiFi.begin(ssid.c_str(), password.c_str());
76
- task.enableDelayed(SCAN_INTERVAL);
77
- return;
78
- }
79
- ```
80
-
81
- The fix:
82
- - Removes dependency on scan results for manual connections
83
- - Calls `WiFi.begin()` directly to reconnect to the router
84
- - Lets ESP hardware auto-detect the router's channel (as designed)
85
- - Adds clear logging to show reconnection attempts
86
-
87
- ## Verification
88
-
89
- After applying the fix, the expected behavior is:
90
-
91
- ```
92
- Step 3: Waiting for station reconnection...
93
- CONNECTION: eventSTADisconnectedHandler: ARDUINO_EVENT_WIFI_STA_DISCONNECTED
94
- CONNECTION: eraseClosedConnections():
95
- CONNECTION: connectToAP(): Manual connection - attempting to reconnect to MyRouter
96
- ✓ Station reconnected successfully!
97
- IP Address: 192.168.18.11
98
- ```
99
-
100
- ## Workaround (for older versions)
101
-
102
- If you're using a version before v1.8.1, you can work around this issue by implementing explicit reconnection logic:
103
-
104
- ```cpp
105
- void setup() {
106
- // ... mesh initialization ...
107
-
108
- // Add a task to monitor and reconnect station
109
- userScheduler.addTask(Task(5000, TASK_FOREVER, [](){
110
- if (WiFi.status() != WL_CONNECTED) {
111
- Serial.println("Station disconnected, reconnecting...");
112
- WiFi.begin(ROUTER_SSID, ROUTER_PASSWORD);
113
- }
114
- }));
115
- }
116
- ```
117
-
118
- ## Related Issues
119
-
120
- - Issue #21: Original user report from @woodlist
121
- - Issue #50: Bug tracking for stationManual() channel issues
122
- - Issue #59: Bridge-centric architecture proposal
123
- - PR #[number]: Fix implementation
124
-
125
- ## Affected Versions
126
-
127
- - **Affected**: v1.5.0 - v1.8.0
128
- - **Fixed**: v1.8.1+
129
-
130
- ## Platforms
131
-
132
- This issue affects all ESP platforms:
133
- - ESP32 (all variants including ESP32-C6, ESP32-S3)
134
- - ESP8266
135
-
136
- ## Additional Notes
137
-
138
- ### Why Does Station Disconnect During Mesh Init?
139
-
140
- When the ESP switches from pure STA mode to AP+STA mode during mesh initialization, the WiFi subsystem may briefly disconnect from the station to reconfigure. This is normal behavior and the library should automatically reconnect.
141
-
142
- ### Channel Matching
143
-
144
- Remember that in AP+STA mode, both the AP (mesh) and STA (router connection) **must use the same WiFi channel**. This is a hardware limitation. The fix ensures reconnection works regardless of channel, but both interfaces will still operate on the same channel.
145
-
146
- ### Best Practice
147
-
148
- For production bridge nodes, consider using the "Station First" pattern to auto-detect the router's channel before initializing the mesh:
149
-
150
- ```cpp
151
- void setup() {
152
- // Step 1: Connect to router first to detect its channel
153
- WiFi.mode(WIFI_STA);
154
- WiFi.begin(ROUTER_SSID, ROUTER_PASSWORD);
155
- while (WiFi.status() != WL_CONNECTED) {
156
- delay(500);
157
- }
158
-
159
- uint8_t detectedChannel = WiFi.channel();
160
- Serial.printf("Router channel: %d\n", detectedChannel);
161
-
162
- WiFi.disconnect();
163
- delay(1000);
164
-
165
- // Step 2: Initialize mesh on the detected channel
166
- mesh.init(MESH_SSID, MESH_PASSWORD, &userScheduler, MESH_PORT,
167
- WIFI_AP_STA, detectedChannel);
168
- mesh.stationManual(ROUTER_SSID, ROUTER_PASSWORD);
169
- }
170
- ```
171
-
172
- This approach guarantees channel compatibility and more reliable connections.