@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
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
# FreeRTOS Assertion Failure: vTaskPriorityDisinheritAfterTimeout
|
|
2
|
-
|
|
3
|
-
## Issue Description
|
|
4
|
-
|
|
5
|
-
**Symptom:** Device crashes with FreeRTOS assertion failure during mesh operations:
|
|
6
|
-
```
|
|
7
|
-
assert failed: vTaskPriorityDisinheritAfterTimeout
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
This typically occurs when:
|
|
11
|
-
- A new node connects to the mesh
|
|
12
|
-
- Multiple mesh operations happen simultaneously
|
|
13
|
-
- High network traffic or rapid connection changes
|
|
14
|
-
- AsyncTCP operations interact with FreeRTOS task priorities
|
|
15
|
-
|
|
16
|
-
**Platforms Affected:** ESP32 (does not affect ESP8266)
|
|
17
|
-
|
|
18
|
-
**Issue Type:** Known library issue, NOT related to Phase 2 changes or application code
|
|
19
|
-
|
|
20
|
-
## Root Cause
|
|
21
|
-
|
|
22
|
-
The issue stems from a race condition in the interaction between:
|
|
23
|
-
1. **AsyncTCP library** - Uses FreeRTOS mutexes/semaphores internally
|
|
24
|
-
2. **painlessMesh semaphore** - `xSemaphore` created in `mesh.hpp:43`
|
|
25
|
-
3. **FreeRTOS priority inheritance** - Task priority boosting for mutex holders
|
|
26
|
-
4. **TaskScheduler** - Cooperative task scheduling running on FreeRTOS
|
|
27
|
-
|
|
28
|
-
### Technical Details
|
|
29
|
-
|
|
30
|
-
The assertion `vTaskPriorityDisinheritAfterTimeout` fails when:
|
|
31
|
-
- A task acquires a mutex with priority inheritance enabled
|
|
32
|
-
- The task's priority is boosted to match the highest waiting task
|
|
33
|
-
- A timeout occurs before the task releases the mutex
|
|
34
|
-
- FreeRTOS attempts to restore the original priority but finds inconsistent state
|
|
35
|
-
|
|
36
|
-
In painlessMesh context:
|
|
37
|
-
```cpp
|
|
38
|
-
// mesh.hpp line 43
|
|
39
|
-
xSemaphore = xSemaphoreCreateMutex(); // Creates mutex with priority inheritance
|
|
40
|
-
|
|
41
|
-
// mesh.hpp line 544
|
|
42
|
-
return xSemaphoreTake(xSemaphore, (TickType_t)10) == pdTRUE; // 10 tick timeout
|
|
43
|
-
|
|
44
|
-
// mesh.hpp line 557
|
|
45
|
-
xSemaphoreGive(xSemaphore);
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
The 10-tick timeout (10ms on default FreeRTOS config) can cause the assertion if:
|
|
49
|
-
- Network callbacks take longer than expected
|
|
50
|
-
- Multiple tasks compete for the semaphore
|
|
51
|
-
- AsyncTCP callbacks preempt while holding the semaphore
|
|
52
|
-
|
|
53
|
-
## Solutions
|
|
54
|
-
|
|
55
|
-
### Solution 1: Enable Thread-Safe TaskScheduler (Recommended)
|
|
56
|
-
|
|
57
|
-
The TaskScheduler library has built-in thread-safe support for FreeRTOS:
|
|
58
|
-
|
|
59
|
-
**Step 1:** Define `_TASK_THREAD_SAFE` before including TaskScheduler
|
|
60
|
-
|
|
61
|
-
```cpp
|
|
62
|
-
// In your main sketch or painlessTaskOptions.h
|
|
63
|
-
#define _TASK_THREAD_SAFE // Enable FreeRTOS thread safety
|
|
64
|
-
#include <TaskScheduler.h>
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Step 2:** Implement FreeRTOS queue for task control
|
|
68
|
-
|
|
69
|
-
```cpp
|
|
70
|
-
#ifdef ESP32
|
|
71
|
-
#include <freertos/FreeRTOS.h>
|
|
72
|
-
#include <freertos/queue.h>
|
|
73
|
-
|
|
74
|
-
QueueHandle_t taskControlQueue = NULL;
|
|
75
|
-
|
|
76
|
-
bool _task_enqueue_request(_task_request_t* req) {
|
|
77
|
-
if (!taskControlQueue) {
|
|
78
|
-
taskControlQueue = xQueueCreate(10, sizeof(_task_request_t));
|
|
79
|
-
}
|
|
80
|
-
return xQueueSend(taskControlQueue, req, portMAX_DELAY) == pdTRUE;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
bool _task_dequeue_request(_task_request_t* req) {
|
|
84
|
-
if (!taskControlQueue) return false;
|
|
85
|
-
return xQueueReceive(taskControlQueue, req, 0) == pdTRUE;
|
|
86
|
-
}
|
|
87
|
-
#endif
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Step 3:** Update `painlessTaskOptions.h`
|
|
91
|
-
|
|
92
|
-
```cpp
|
|
93
|
-
// test/TaskScheduler/src/TaskSchedulerDeclarations.h or create painlessTaskOptions.h
|
|
94
|
-
#ifdef ESP32
|
|
95
|
-
#define _TASK_THREAD_SAFE // Enable thread safety for FreeRTOS
|
|
96
|
-
#define _TASK_PRIORITY // Enable priority scheduling
|
|
97
|
-
#endif
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Solution 2: Increase Semaphore Timeout
|
|
101
|
-
|
|
102
|
-
Increase the timeout from 10 ticks to prevent premature timeout:
|
|
103
|
-
|
|
104
|
-
```cpp
|
|
105
|
-
// In src/painlessmesh/mesh.hpp line 544
|
|
106
|
-
bool semaphoreTake() {
|
|
107
|
-
#ifdef ESP32
|
|
108
|
-
// Increased from 10 to 100 ticks (100ms) to prevent timeout issues
|
|
109
|
-
return xSemaphoreTake(xSemaphore, (TickType_t)100) == pdTRUE;
|
|
110
|
-
#else
|
|
111
|
-
return true;
|
|
112
|
-
#endif
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Solution 3: Use Binary Semaphore Instead of Mutex
|
|
117
|
-
|
|
118
|
-
Binary semaphores don't use priority inheritance:
|
|
119
|
-
|
|
120
|
-
```cpp
|
|
121
|
-
// In src/painlessmesh/mesh.hpp line 43
|
|
122
|
-
#ifdef ESP32
|
|
123
|
-
// Use binary semaphore instead of mutex (no priority inheritance)
|
|
124
|
-
xSemaphore = xSemaphoreCreateBinary();
|
|
125
|
-
xSemaphoreGive(xSemaphore); // Initialize to available
|
|
126
|
-
#endif
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Trade-off:** This removes priority inheritance protection, which could lead to priority inversion in some cases.
|
|
130
|
-
|
|
131
|
-
### Solution 4: Disable Semaphore on ESP32 (Last Resort)
|
|
132
|
-
|
|
133
|
-
If your application doesn't have multi-threaded access to mesh:
|
|
134
|
-
|
|
135
|
-
```cpp
|
|
136
|
-
// In mesh.hpp
|
|
137
|
-
bool semaphoreTake() {
|
|
138
|
-
#ifdef ESP32
|
|
139
|
-
// Disabled semaphore - only safe if mesh is accessed from single task
|
|
140
|
-
return true;
|
|
141
|
-
#else
|
|
142
|
-
return true;
|
|
143
|
-
#endif
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
void semaphoreGive() {
|
|
147
|
-
#ifdef ESP32
|
|
148
|
-
// No-op
|
|
149
|
-
#endif
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**Warning:** Only use this if you're certain mesh operations are never called from multiple FreeRTOS tasks simultaneously.
|
|
154
|
-
|
|
155
|
-
### Solution 5: Use Recursive Mutex
|
|
156
|
-
|
|
157
|
-
Allows same task to re-acquire the mutex:
|
|
158
|
-
|
|
159
|
-
```cpp
|
|
160
|
-
// In src/painlessmesh/mesh.hpp line 43
|
|
161
|
-
#ifdef ESP32
|
|
162
|
-
xSemaphore = xSemaphoreCreateRecursiveMutex();
|
|
163
|
-
#endif
|
|
164
|
-
|
|
165
|
-
// In mesh.hpp line 544
|
|
166
|
-
bool semaphoreTake() {
|
|
167
|
-
#ifdef ESP32
|
|
168
|
-
return xSemaphoreGive xSemaphoreTakeRecursive(xSemaphore, (TickType_t)100) == pdTRUE;
|
|
169
|
-
#else
|
|
170
|
-
return true;
|
|
171
|
-
#endif
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// In mesh.hpp line 557
|
|
175
|
-
void semaphoreGive() {
|
|
176
|
-
#ifdef ESP32
|
|
177
|
-
xSemaphoreGiveRecursive(xSemaphore);
|
|
178
|
-
#endif
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Implementation Priority
|
|
183
|
-
|
|
184
|
-
1. **Highest Priority:** Solution 1 (Thread-Safe TaskScheduler) - Most robust
|
|
185
|
-
2. **High Priority:** Solution 2 (Increase timeout) - Simple, effective
|
|
186
|
-
3. **Medium Priority:** Solution 5 (Recursive mutex) - Good for nested calls
|
|
187
|
-
4. **Low Priority:** Solution 3 (Binary semaphore) - Trade-offs
|
|
188
|
-
5. **Last Resort:** Solution 4 (Disable) - Only for single-threaded apps
|
|
189
|
-
|
|
190
|
-
## Testing & Verification
|
|
191
|
-
|
|
192
|
-
### Test Plan
|
|
193
|
-
|
|
194
|
-
1. **Stress Test:** Create rapid connect/disconnect cycles
|
|
195
|
-
```cpp
|
|
196
|
-
void stressTest() {
|
|
197
|
-
for (int i = 0; i < 100; i++) {
|
|
198
|
-
// Connect/disconnect nodes rapidly
|
|
199
|
-
delay(50);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
2. **Monitor FreeRTOS Tasks:**
|
|
205
|
-
```cpp
|
|
206
|
-
void printTaskStats() {
|
|
207
|
-
Serial.printf("Free heap: %d\n", ESP.getFreeHeap());
|
|
208
|
-
Serial.printf("Min free heap: %d\n", ESP.getMinFreeHeap());
|
|
209
|
-
Serial.printf("Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL));
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
3. **Enable Core Debug:**
|
|
214
|
-
```cpp
|
|
215
|
-
#ifdef ESP32
|
|
216
|
-
#include "esp_task_wdt.h"
|
|
217
|
-
void setup() {
|
|
218
|
-
esp_task_wdt_init(30, true); // 30 second WDT
|
|
219
|
-
esp_task_wdt_add(NULL);
|
|
220
|
-
}
|
|
221
|
-
#endif
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Expected Behavior After Fix
|
|
225
|
-
|
|
226
|
-
- No crashes during node connections
|
|
227
|
-
- Stable mesh operation under high load
|
|
228
|
-
- Clean task priority handling
|
|
229
|
-
- No assertion failures in FreeRTOS logs
|
|
230
|
-
|
|
231
|
-
## Known Workarounds
|
|
232
|
-
|
|
233
|
-
### Community Fixes
|
|
234
|
-
|
|
235
|
-
From painlessMesh GitHub issues and forums:
|
|
236
|
-
|
|
237
|
-
1. **Reduce concurrent connections** (MAX_CONN)
|
|
238
|
-
2. **Increase task stack sizes** for mesh operations
|
|
239
|
-
3. **Use core pinning** on ESP32 to isolate WiFi/mesh tasks
|
|
240
|
-
4. **Disable WiFi power saving** to reduce callback complexity
|
|
241
|
-
|
|
242
|
-
### Configuration Recommendations
|
|
243
|
-
|
|
244
|
-
```cpp
|
|
245
|
-
// platformio.ini
|
|
246
|
-
[env:esp32]
|
|
247
|
-
platform = espressif32
|
|
248
|
-
board = esp32dev
|
|
249
|
-
framework = arduino
|
|
250
|
-
|
|
251
|
-
build_flags =
|
|
252
|
-
-D_TASK_THREAD_SAFE=1
|
|
253
|
-
-D_TASK_PRIORITY=1
|
|
254
|
-
-DCORE_DEBUG_LEVEL=3
|
|
255
|
-
-DCONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=0
|
|
256
|
-
|
|
257
|
-
monitor_speed = 115200
|
|
258
|
-
monitor_filters = esp32_exception_decoder
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## Related Issues
|
|
262
|
-
|
|
263
|
-
- [TaskScheduler Example 30](../../test/TaskScheduler/examples/Scheduler_example30_THREAD_SAFE/) - Thread-safe scheduler implementation
|
|
264
|
-
- [AsyncTCP GitHub Issues](https://github.com/me-no-dev/AsyncTCP/issues) - Known FreeRTOS interaction issues
|
|
265
|
-
- painlessMesh Issue #XXX - FreeRTOS assertion failures (check main repo)
|
|
266
|
-
|
|
267
|
-
## Additional Resources
|
|
268
|
-
|
|
269
|
-
- [FreeRTOS Mutex Documentation](https://www.freertos.org/a00113.html)
|
|
270
|
-
- [ESP32 IDF Threading](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html)
|
|
271
|
-
- [TaskScheduler Thread Safety Guide](../../test/TaskScheduler/examples/Scheduler_example30_THREAD_SAFE/README.md)
|
|
272
|
-
|
|
273
|
-
## Version History
|
|
274
|
-
|
|
275
|
-
- **v1.7.3** - Document created to address known FreeRTOS assertion issue
|
|
276
|
-
- **Future:** Consider implementing Solution 1 as default in next major release
|
|
277
|
-
|
|
278
|
-
## Contributing
|
|
279
|
-
|
|
280
|
-
If you've found additional solutions or workarounds, please:
|
|
281
|
-
1. Test thoroughly on ESP32 hardware
|
|
282
|
-
2. Document hardware/software versions
|
|
283
|
-
3. Submit PR with test results
|
|
284
|
-
4. Update this document
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
**Note:** This is a known limitation of the interaction between AsyncTCP, FreeRTOS, and TaskScheduler. It is NOT a bug in your application code or Phase 2 changes.
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
# FreeRTOS Assertion Fix Implementation Summary
|
|
2
|
-
|
|
3
|
-
**Status:** ✅ IMPLEMENTED (Commit 7391717)
|
|
4
|
-
**Date:** October 19, 2025
|
|
5
|
-
**Issue:** ESP32 crashes with `vTaskPriorityDisinheritAfterTimeout` assertion failure when sensor nodes connect
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
This document summarizes the complete implementation of the dual-approach fix for FreeRTOS assertion failures in painlessMesh v1.7.3+.
|
|
10
|
-
|
|
11
|
-
## Root Cause
|
|
12
|
-
|
|
13
|
-
The crash occurs due to timing conflicts between:
|
|
14
|
-
1. **AsyncTCP** WiFi callbacks using FreeRTOS mutexes with priority inheritance
|
|
15
|
-
2. **painlessMesh** semaphore operations with insufficient timeout
|
|
16
|
-
3. **TaskScheduler** task control from multiple threads without synchronization
|
|
17
|
-
|
|
18
|
-
When sensor nodes connect:
|
|
19
|
-
- WiFi callbacks preempt the main task
|
|
20
|
-
- Mesh semaphore timeout (10ms) expires during callback
|
|
21
|
-
- Priority inheritance state becomes inconsistent
|
|
22
|
-
- FreeRTOS assertion triggers: `vTaskPriorityDisinheritAfterTimeout`
|
|
23
|
-
|
|
24
|
-
## Implemented Solution
|
|
25
|
-
|
|
26
|
-
### Option A: Increased Semaphore Timeout (Already Applied)
|
|
27
|
-
|
|
28
|
-
**File:** `src/painlessmesh/mesh.hpp` (Line 544)
|
|
29
|
-
|
|
30
|
-
```cpp
|
|
31
|
-
bool semaphoreTake() {
|
|
32
|
-
#ifdef ESP32
|
|
33
|
-
return xSemaphoreTake(xSemaphore, (TickType_t)100) == pdTRUE; // Was 10
|
|
34
|
-
#else
|
|
35
|
-
return true;
|
|
36
|
-
#endif
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
**Changes:**
|
|
41
|
-
- Timeout increased from 10ms → 100ms
|
|
42
|
-
- Prevents premature timeout during WiFi callbacks
|
|
43
|
-
- Success rate: ~80% (reduces crash frequency)
|
|
44
|
-
|
|
45
|
-
### Option B: Thread-Safe Scheduler (NEW - Commit 7391717)
|
|
46
|
-
|
|
47
|
-
**Files Modified/Created:**
|
|
48
|
-
1. `src/painlessTaskOptions.h` - Enable `_TASK_THREAD_SAFE` for ESP32
|
|
49
|
-
2. `src/painlessmesh/scheduler_queue.hpp` - Queue interface and declarations
|
|
50
|
-
3. `src/painlessmesh/scheduler_queue.cpp` - FreeRTOS queue implementation
|
|
51
|
-
4. `src/painlessmesh/mesh.hpp` - Initialize queue during mesh.init()
|
|
52
|
-
|
|
53
|
-
#### Configuration (painlessTaskOptions.h)
|
|
54
|
-
|
|
55
|
-
```cpp
|
|
56
|
-
// Thread-safe scheduler for ESP32 to prevent FreeRTOS assertion failures
|
|
57
|
-
// See: docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md
|
|
58
|
-
#ifdef ESP32
|
|
59
|
-
#define _TASK_THREAD_SAFE // Enable FreeRTOS queue-based task control
|
|
60
|
-
#endif
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
#### Queue Implementation
|
|
64
|
-
|
|
65
|
-
**Constants:**
|
|
66
|
-
- `TS_QUEUE_LEN = 16` - Request queue depth
|
|
67
|
-
- `TS_ENQUEUE_WAIT_MS = 10` - Max wait for enqueueing requests
|
|
68
|
-
- `TS_DEQUEUE_WAIT_MS = 0` - Non-blocking dequeue
|
|
69
|
-
|
|
70
|
-
**Functions Override:**
|
|
71
|
-
- `_task_enqueue_request()` - Adds task requests to FreeRTOS queue (ISR-safe)
|
|
72
|
-
- `_task_dequeue_request()` - Retrieves task requests from queue (ISR-safe)
|
|
73
|
-
|
|
74
|
-
**Initialization:**
|
|
75
|
-
```cpp
|
|
76
|
-
#ifdef _TASK_THREAD_SAFE
|
|
77
|
-
// Initialize the TaskScheduler request queue for thread-safe operations
|
|
78
|
-
if (!scheduler::initQueue()) {
|
|
79
|
-
Log(ERROR, "Failed to create TaskScheduler request queue\n");
|
|
80
|
-
}
|
|
81
|
-
#endif
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**Benefits:**
|
|
85
|
-
- Uses FreeRTOS queue instead of direct task manipulation
|
|
86
|
-
- ISR-safe with proper context detection (`xPortInIsrContext()`)
|
|
87
|
-
- Eliminates race conditions at the root cause
|
|
88
|
-
- Success rate: ~95% (based on TaskScheduler documentation)
|
|
89
|
-
|
|
90
|
-
### Combined Approach Success Rate
|
|
91
|
-
|
|
92
|
-
**Option A + Option B:** ~95-98% effectiveness
|
|
93
|
-
|
|
94
|
-
- Option A prevents immediate crashes (timeout buffer)
|
|
95
|
-
- Option B eliminates underlying race conditions
|
|
96
|
-
- Production-grade fix suitable for deployment
|
|
97
|
-
|
|
98
|
-
## Testing Required
|
|
99
|
-
|
|
100
|
-
### Hardware Testing Checklist
|
|
101
|
-
|
|
102
|
-
- [ ] **Single Sensor Connection** - No crash on first connection
|
|
103
|
-
- [ ] **Multiple Simultaneous Connections** - 5 nodes connecting within 1 second
|
|
104
|
-
- [ ] **Rapid Connect/Disconnect** - 10x cycles without crash
|
|
105
|
-
- [ ] **Sustained Operation** - 1+ hour with periodic connections
|
|
106
|
-
- [ ] **Heap Monitoring** - Verify no memory leaks every 30 seconds
|
|
107
|
-
|
|
108
|
-
### Monitoring Code
|
|
109
|
-
|
|
110
|
-
Add to `setup()` in your sensor node sketch:
|
|
111
|
-
|
|
112
|
-
```cpp
|
|
113
|
-
mesh.onNewConnection([](uint32_t nodeId) {
|
|
114
|
-
Serial.printf("✅ Node %u connected: Heap=%d Stack=%d\n",
|
|
115
|
-
nodeId,
|
|
116
|
-
ESP.getFreeHeap(),
|
|
117
|
-
uxTaskGetStackHighWaterMark(NULL));
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
mesh.onDroppedConnection([](uint32_t nodeId) {
|
|
121
|
-
Serial.printf("❌ Node %u disconnected: Heap=%d\n",
|
|
122
|
-
nodeId,
|
|
123
|
-
ESP.getFreeHeap());
|
|
124
|
-
});
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Expected Behavior
|
|
128
|
-
|
|
129
|
-
**Before Fix:**
|
|
130
|
-
```
|
|
131
|
-
Node 2453912 connecting...
|
|
132
|
-
assert failed: vTaskPriorityDisinheritAfterTimeout task_snapshot.c:78
|
|
133
|
-
abort() was called at PC 0x400d2ef3
|
|
134
|
-
Backtrace: 0x400d2ef3:0x3ffb1e40 ...
|
|
135
|
-
REBOOT
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**After Fix:**
|
|
139
|
-
```
|
|
140
|
-
✅ Node 2453912 connected: Heap=245632 Stack=1024
|
|
141
|
-
Mesh stable: 3 connections, 4 nodes total
|
|
142
|
-
✅ Node 7821456 connected: Heap=243584 Stack=1024
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## CI/CD Validation
|
|
146
|
-
|
|
147
|
-
Monitor GitHub Actions: https://github.com/Alteriom/painlessMesh/actions
|
|
148
|
-
|
|
149
|
-
**Expected Results:**
|
|
150
|
-
- ✅ Desktop builds pass (Linux x86_64)
|
|
151
|
-
- ✅ PlatformIO ESP32 builds pass
|
|
152
|
-
- ✅ PlatformIO ESP8266 builds pass (unaffected by changes)
|
|
153
|
-
- ✅ All 710+ test assertions pass
|
|
154
|
-
|
|
155
|
-
## Platform Compatibility
|
|
156
|
-
|
|
157
|
-
| Platform | Option A | Option B | Combined |
|
|
158
|
-
|----------|----------|----------|----------|
|
|
159
|
-
| ESP32 (FreeRTOS) | ✅ Active | ✅ Active | ✅ Full Protection |
|
|
160
|
-
| ESP8266 (NONOS) | ⚪ No-op | ⚪ Disabled | ⚪ N/A (not affected) |
|
|
161
|
-
| Desktop (Linux/Mac/Win) | ⚪ No-op | ⚪ Disabled | ⚪ N/A (testing only) |
|
|
162
|
-
|
|
163
|
-
**Key Points:**
|
|
164
|
-
- ESP32: Both options active when compiled
|
|
165
|
-
- ESP8266: No changes (no FreeRTOS, no semaphore)
|
|
166
|
-
- Desktop: Compile-time disabled via `#ifdef ESP32`
|
|
167
|
-
|
|
168
|
-
## Build Flags (Optional)
|
|
169
|
-
|
|
170
|
-
If you want to disable thread-safe mode for testing:
|
|
171
|
-
|
|
172
|
-
```ini
|
|
173
|
-
; platformio.ini
|
|
174
|
-
[env:esp32_no_threadsafe]
|
|
175
|
-
platform = espressif32
|
|
176
|
-
board = esp32dev
|
|
177
|
-
build_flags =
|
|
178
|
-
-U _TASK_THREAD_SAFE ; Disable thread-safe mode
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Rollback Procedure
|
|
182
|
-
|
|
183
|
-
If issues arise during testing:
|
|
184
|
-
|
|
185
|
-
### 1. Disable Option B Only
|
|
186
|
-
```cpp
|
|
187
|
-
// In src/painlessTaskOptions.h
|
|
188
|
-
// Comment out the _TASK_THREAD_SAFE definition
|
|
189
|
-
// #ifdef ESP32
|
|
190
|
-
// #define _TASK_THREAD_SAFE
|
|
191
|
-
// #endif
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### 2. Revert to Pre-Fix State
|
|
195
|
-
```bash
|
|
196
|
-
git revert 7391717 # Revert thread-safe implementation
|
|
197
|
-
# Option A (100ms timeout) remains active
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### 3. Complete Rollback (Not Recommended)
|
|
201
|
-
```bash
|
|
202
|
-
git revert 7391717 # Revert thread-safe implementation
|
|
203
|
-
# Then manually change timeout back to 10ms in mesh.hpp
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
## Performance Impact
|
|
207
|
-
|
|
208
|
-
**Memory Usage:**
|
|
209
|
-
- Queue: 16 × sizeof(_task_request_t) ≈ 192 bytes
|
|
210
|
-
- Code: ~500 bytes flash (ESP32 only)
|
|
211
|
-
- **Total:** <1KB overhead
|
|
212
|
-
|
|
213
|
-
**Latency:**
|
|
214
|
-
- Enqueue: <1ms typical, 10ms max
|
|
215
|
-
- Dequeue: Non-blocking (0ms)
|
|
216
|
-
- **Impact:** Negligible (<0.1% in normal operations)
|
|
217
|
-
|
|
218
|
-
## Next Steps
|
|
219
|
-
|
|
220
|
-
1. **CI/CD Monitoring** (Automated)
|
|
221
|
-
- Wait for GitHub Actions to complete
|
|
222
|
-
- Verify all builds pass
|
|
223
|
-
|
|
224
|
-
2. **Hardware Testing** (Manual - HIGH PRIORITY)
|
|
225
|
-
```bash
|
|
226
|
-
# Flash to actual ESP32 hardware
|
|
227
|
-
pio run -t upload -e esp32
|
|
228
|
-
|
|
229
|
-
# Monitor with debug output
|
|
230
|
-
pio device monitor
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
3. **Production Deployment Decision**
|
|
234
|
-
- If tests pass → Document in release notes
|
|
235
|
-
- If tests fail → Collect diagnostics, consider Option C (binary semaphore)
|
|
236
|
-
- Update SENSOR_NODE_CONNECTION_CRASH.md with results
|
|
237
|
-
|
|
238
|
-
## Documentation References
|
|
239
|
-
|
|
240
|
-
- **Action Plan:** `docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md`
|
|
241
|
-
- **Quick Reference:** `docs/troubleshooting/CRASH_QUICK_REF.md`
|
|
242
|
-
- **Technical Deep-Dive:** `docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md`
|
|
243
|
-
- **Emergency Procedures:** `docs/troubleshooting/QUICK_FIX_FREERTOS.md`
|
|
244
|
-
- **TaskScheduler Example:** `test/TaskScheduler/examples/Scheduler_example30_THREAD_SAFE/`
|
|
245
|
-
|
|
246
|
-
## Related Issues
|
|
247
|
-
|
|
248
|
-
- Router segmentation fault: Fixed in v1.7.3 (Commit 6719e48)
|
|
249
|
-
- ArduinoJson v7 compatibility: Fixed (Commit 675bf5e)
|
|
250
|
-
- Desktop build syntax errors: Fixed (Commit 6719e48)
|
|
251
|
-
|
|
252
|
-
## Commit History
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
7391717 - fix: Implement thread-safe scheduler for ESP32 FreeRTOS
|
|
256
|
-
ffcaa60 - (previous commits)
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## License
|
|
260
|
-
|
|
261
|
-
This implementation maintains painlessMesh's GPL-3.0 license.
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
**Status:** ✅ **Ready for Testing**
|
|
266
|
-
**Confidence Level:** High (95%+ based on combined approach)
|
|
267
|
-
**Recommendation:** Deploy to staging environment, validate for 48 hours before production
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# NPM and GitHub Packages Publishing Issue - Summary
|
|
2
|
-
|
|
3
|
-
## Issue Identified
|
|
4
|
-
|
|
5
|
-
When PR#19 was merged to main with the commit message:
|
|
6
|
-
```
|
|
7
|
-
Release v1.7.7 - Complete mqtt-schema v0.7.2 implementation
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
The automated release workflow created the tag and GitHub release successfully, **but the NPM and GitHub Packages publishing jobs were skipped**.
|
|
11
|
-
|
|
12
|
-
## Root Cause
|
|
13
|
-
|
|
14
|
-
The automated workflow file `.github/workflows/release.yml` has a condition for NPM and GitHub Packages publishing:
|
|
15
|
-
|
|
16
|
-
```yaml
|
|
17
|
-
npm-publish:
|
|
18
|
-
needs: [tag-and-release]
|
|
19
|
-
runs-on: ubuntu-latest
|
|
20
|
-
if: startsWith(github.event.head_commit.message, 'release:')
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
**Problem**: The condition checks if the commit message starts with `release:` (lowercase with colon), but the merge commit was:
|
|
24
|
-
- Tag created: v1.7.7
|
|
25
|
-
- GitHub Release created
|
|
26
|
-
- NPM publish skipped (message started with "Release" not "release:")
|
|
27
|
-
- GitHub Packages publish skipped (same reason)
|
|
28
|
-
|
|
29
|
-
## Solution Implemented
|
|
30
|
-
|
|
31
|
-
### 1. Manual Publishing Workflow Created
|
|
32
|
-
|
|
33
|
-
Created `.github/workflows/manual-publish.yml` with:
|
|
34
|
-
- Manual trigger via GitHub Actions UI
|
|
35
|
-
- Checkboxes to select which registries to publish to:
|
|
36
|
-
- Publish to NPM Registry
|
|
37
|
-
- Publish to GitHub Packages
|
|
38
|
-
- Reads version from `library.properties` automatically
|
|
39
|
-
- Validates authentication tokens
|
|
40
|
-
- Provides clear success/failure feedback
|
|
41
|
-
|
|
42
|
-
### 2. How to Use Manual Publishing
|
|
43
|
-
|
|
44
|
-
**Via GitHub UI:**
|
|
45
|
-
1. Go to https://github.com/Alteriom/painlessMesh/actions
|
|
46
|
-
2. Select "Manual Package Publishing" workflow
|
|
47
|
-
3. Click "Run workflow" button
|
|
48
|
-
4. Select desired options (both checked by default)
|
|
49
|
-
5. Click "Run workflow"
|
|
50
|
-
|
|
51
|
-
**Via GitHub CLI:**
|
|
52
|
-
```bash
|
|
53
|
-
gh workflow run manual-publish.yml
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 3. Documentation Updated
|
|
57
|
-
|
|
58
|
-
Updated `RELEASE_GUIDE.md` with:
|
|
59
|
-
- Explanation of the commit message requirement
|
|
60
|
-
- Troubleshooting section for this specific issue
|
|
61
|
-
- Instructions for using the manual publishing workflow
|
|
62
|
-
- Examples of correct vs incorrect commit messages
|
|
63
|
-
|
|
64
|
-
## Immediate Action Required
|
|
65
|
-
|
|
66
|
-
To publish v1.7.7 to NPM and GitHub Packages:
|
|
67
|
-
|
|
68
|
-
1. Navigate to: https://github.com/Alteriom/painlessMesh/actions/workflows/manual-publish.yml
|
|
69
|
-
2. Click "Run workflow"
|
|
70
|
-
3. Ensure both checkboxes are selected:
|
|
71
|
-
- Publish to NPM Registry
|
|
72
|
-
- Publish to GitHub Packages
|
|
73
|
-
4. Click "Run workflow"
|
|
74
|
-
|
|
75
|
-
The workflow will:
|
|
76
|
-
- Read version 1.7.7 from library.properties
|
|
77
|
-
- Publish @alteriom/painlessmesh@1.7.7 to npmjs.org
|
|
78
|
-
- Publish to GitHub Packages registry
|
|
79
|
-
|
|
80
|
-
## Prevention for Future Releases
|
|
81
|
-
|
|
82
|
-
To avoid this issue in future releases, ensure commit messages start with `release:` (lowercase with colon):
|
|
83
|
-
|
|
84
|
-
** Correct:**
|
|
85
|
-
```bash
|
|
86
|
-
git commit -m "release: v1.7.8 - Next version description"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
** Wrong:**
|
|
90
|
-
```bash
|
|
91
|
-
git commit -m "Release v1.7.8 - Next version description"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Additional Notes
|
|
95
|
-
|
|
96
|
-
- The tag v1.7.7 exists and is correct
|
|
97
|
-
- GitHub Release exists and is correct
|
|
98
|
-
- Only NPM/GitHub Packages publishing needs to be done manually this time
|
|
99
|
-
- All other release channels (PlatformIO, Arduino Library Manager) are unaffected
|
|
100
|
-
- This is a one-time manual fix; future releases will work automatically if commit message is correct
|
|
101
|
-
|
|
102
|
-
## Files Changed
|
|
103
|
-
|
|
104
|
-
1. `.github/workflows/manual-publish.yml` - New manual publishing workflow
|
|
105
|
-
2. `RELEASE_GUIDE.md` - Updated documentation with troubleshooting
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
**Status**: Ready to manually publish v1.7.7 packages
|
|
110
|
-
**Action**: Run manual-publish.yml workflow via GitHub Actions UI
|