@alteriom/painlessmesh 1.8.14 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +89 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +70 -143
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/docs/troubleshooting/faq.md +113 -12
- package/examples/basic/test/simulator/CMakeLists.txt +40 -0
- package/examples/basic/test/simulator/README.md +149 -0
- package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
- package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
- package/examples/bridge/bridge.ino +17 -4
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +51 -6
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -3
- package/src/arduino/wifi.hpp +380 -13
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -96
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -111
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -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.
|