@alteriom/painlessmesh 1.6.1 → 1.7.3

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 (152) hide show
  1. package/CHANGELOG.md +435 -144
  2. package/LICENSE +674 -674
  3. package/README.md +491 -434
  4. package/RELEASE_GUIDE.md +504 -418
  5. package/docs/DOCUMENTATION_MIGRATION_PLAN.md +175 -175
  6. package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +1062 -0
  7. package/docs/MESH_TOPOLOGY_GUIDE.md +992 -0
  8. package/docs/MESH_TOPOLOGY_PROGRESS.md +422 -0
  9. package/docs/MQTT_BRIDGE_COMMANDS.md +894 -0
  10. package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +324 -0
  11. package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +576 -0
  12. package/docs/MQTT_SCHEMA_COMPLIANCE.md +285 -0
  13. package/docs/MQTT_SCHEMA_PROPOSALS.md +446 -0
  14. package/docs/MQTT_SCHEMA_REVIEW.md +690 -0
  15. package/docs/OTA_COMMANDS_REFERENCE.md +554 -0
  16. package/docs/PHASE1_GUIDE.md +349 -0
  17. package/docs/PHASE2_GUIDE.md +543 -0
  18. package/docs/README.md +130 -71
  19. package/docs/SCHEMA_VALIDATION_CHECKLIST.md +222 -0
  20. package/docs/alteriom/overview.md +507 -507
  21. package/docs/api/core-api.md +606 -606
  22. package/docs/architecture/mesh-architecture.md +378 -378
  23. package/docs/architecture/plugin-system.md +516 -516
  24. package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +166 -0
  25. package/docs/archive/FEATURE_PROPOSALS.md +337 -0
  26. package/docs/archive/LIBRARY_JSON_FIX.md +98 -0
  27. package/docs/archive/LIBRARY_STRUCTURE_FIX.md +215 -0
  28. package/docs/archive/PHASE1_IMPLEMENTATION.md +325 -0
  29. package/docs/archive/PHASE2_IMPLEMENTATION.md +567 -0
  30. package/docs/archive/RELEASE_SUMMARY.md +173 -0
  31. package/docs/archive/SCONS_BUILD_FIX.md +313 -0
  32. package/docs/archive/TRIGGER_RELEASE.md +280 -0
  33. package/docs/archive/VECTOR_INCLUDE_FIX.md +129 -0
  34. package/docs/archive/ota-and-status-enhancements.md +911 -0
  35. package/docs/archive/ota-status-architecture-diagrams.md +658 -0
  36. package/docs/archive/ota-status-quick-reference.md +284 -0
  37. package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +71 -0
  38. package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +1011 -0
  39. package/docs/development/DOCKER_TESTING.md +196 -0
  40. package/docs/development/PLATFORMIO_USAGE.md +180 -0
  41. package/docs/development/TESTING_SUMMARY.md +126 -0
  42. package/docs/development/contributing.md +301 -0
  43. package/docs/development/documentation.md +583 -0
  44. package/docs/getting-started/first-mesh.md +409 -409
  45. package/docs/getting-started/installation.md +274 -274
  46. package/docs/getting-started/quickstart.md +157 -157
  47. package/docs/improvements/FUTURE_PROPOSALS.md +1016 -0
  48. package/docs/improvements/IMPLEMENTATION_HISTORY.md +1091 -0
  49. package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +709 -0
  50. package/docs/improvements/README.md +212 -69
  51. package/docs/platformio-publishing.md +255 -0
  52. package/docs/platformio-setup-summary.md +121 -0
  53. package/docs/releases/FEATURE_HISTORY.md +543 -0
  54. package/docs/releases/PATCH_v1.7.3.md +262 -0
  55. package/docs/releases/PHASE1_SUMMARY.md +246 -0
  56. package/docs/releases/PHASE2_SUMMARY.md +499 -0
  57. package/docs/releases/RELEASE_NOTES_1.7.0.md +539 -0
  58. package/docs/troubleshooting/common-issues.md +520 -520
  59. package/docs/troubleshooting/debugging.md +455 -0
  60. package/docs/troubleshooting/faq.md +472 -472
  61. package/docs/tutorials/basic-examples.md +717 -717
  62. package/docs/wiki/API-Reference.md +245 -245
  63. package/docs/wiki/Complete-Documentation.md +122 -122
  64. package/examples/alteriom/README.md +139 -81
  65. package/examples/alteriom/alteriom.ino +186 -185
  66. package/examples/alteriom/alteriom_sensor_package.hpp +240 -127
  67. package/examples/alteriom/platformio.ini +24 -24
  68. package/examples/alteriomImproved/alteriom_sensor_package.hpp +224 -0
  69. package/examples/{alteriom → alteriomImproved}/improved_sensor_node.ino +245 -245
  70. package/examples/alteriomImproved/platformio.ini +25 -0
  71. package/examples/alteriomPhase1/alteriom_sensor_package.hpp +224 -0
  72. package/examples/alteriomPhase1/phase1_features.ino +242 -0
  73. package/examples/alteriomPhase1/platformio.ini +25 -0
  74. package/examples/alteriomPhase2/alteriom_sensor_package.hpp +224 -0
  75. package/examples/alteriomPhase2/phase2_features.ino +186 -0
  76. package/examples/alteriomPhase2/platformio.ini +25 -0
  77. package/examples/{alteriom → alteriomSensorNode}/alteriom_sensor_node.ino +183 -183
  78. package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +224 -0
  79. package/examples/alteriomSensorNode/platformio.ini +25 -0
  80. package/examples/basic/basic.ino +66 -66
  81. package/examples/basic/platformio.ini +25 -25
  82. package/examples/bridge/bridge.ino +51 -51
  83. package/examples/bridge/mesh_event_publisher.hpp +253 -0
  84. package/examples/bridge/mesh_topology_reporter.hpp +303 -0
  85. package/examples/bridge/mqtt_command_bridge.hpp +459 -0
  86. package/examples/bridge/mqtt_status_bridge.hpp +519 -0
  87. package/examples/bridge/platformio.ini +25 -25
  88. package/examples/echoNode/echoNode.ino +33 -33
  89. package/examples/echoNode/platformio.ini +25 -25
  90. package/examples/logClient/logClient.ino +109 -109
  91. package/examples/logClient/platformio.ini +25 -25
  92. package/examples/logServer/logServer.ino +81 -81
  93. package/examples/logServer/platformio.ini +25 -25
  94. package/examples/meshCommandNode/alteriom_sensor_package.hpp +235 -0
  95. package/examples/meshCommandNode/meshCommandNode.ino +263 -0
  96. package/examples/meshCommandNode/platformio.ini +25 -0
  97. package/examples/mqttBridge/mqttBridge.ino +118 -118
  98. package/examples/mqttBridge/platformio.ini +26 -26
  99. package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +235 -0
  100. package/examples/mqttCommandBridge/mesh_event_publisher.hpp +253 -0
  101. package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +303 -0
  102. package/examples/mqttCommandBridge/mqttCommandBridge.ino +252 -0
  103. package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +459 -0
  104. package/examples/mqttCommandBridge/platformio.ini +26 -0
  105. package/examples/mqttStatusBridge/mqttStatusBridge.ino +216 -0
  106. package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +522 -0
  107. package/examples/mqttStatusBridge/platformio.ini +26 -0
  108. package/examples/mqttTopologyTest/README.md +467 -0
  109. package/examples/mqttTopologyTest/mqttTopologyTest.ino +748 -0
  110. package/examples/mqttTopologyTest/platformio.ini +26 -0
  111. package/examples/namedMesh/namedMesh.ino +97 -97
  112. package/examples/namedMesh/platformio.ini +25 -25
  113. package/examples/otaReceiver/otaReceiver.ino +79 -79
  114. package/examples/otaReceiver/platformio.ini +25 -25
  115. package/examples/otaSender/otaSender.ino +160 -151
  116. package/examples/otaSender/platformio.ini +25 -25
  117. package/examples/startHere/platformio.ini +25 -25
  118. package/examples/startHere/startHere.ino +159 -159
  119. package/examples/webServer/platformio.ini +27 -27
  120. package/examples/webServer/webServer.ino +89 -89
  121. package/keywords.txt +48 -48
  122. package/library.json +55 -34
  123. package/library.properties +10 -10
  124. package/package.json +86 -78
  125. package/src/AlteriomPainlessMesh.h +97 -97
  126. package/src/arduino/wifi.hpp +365 -365
  127. package/src/boost/asynctcp.hpp +279 -279
  128. package/src/painlessMesh.h +70 -70
  129. package/src/painlessMeshSTA.cpp +236 -236
  130. package/src/painlessMeshSTA.h +58 -58
  131. package/src/painlessTaskOptions.h +4 -4
  132. package/src/painlessmesh/base64.hpp +111 -111
  133. package/src/painlessmesh/buffer.hpp +229 -229
  134. package/src/painlessmesh/callback.hpp +91 -91
  135. package/src/painlessmesh/configuration.hpp +77 -77
  136. package/src/painlessmesh/connection.hpp +192 -192
  137. package/src/painlessmesh/layout.hpp +188 -188
  138. package/src/painlessmesh/logger.hpp +158 -158
  139. package/src/painlessmesh/memory.hpp +119 -119
  140. package/src/painlessmesh/mesh.hpp +761 -560
  141. package/src/painlessmesh/metrics.hpp +322 -322
  142. package/src/painlessmesh/ntp.hpp +263 -263
  143. package/src/painlessmesh/ota.hpp +582 -553
  144. package/src/painlessmesh/plugin.hpp +188 -188
  145. package/src/painlessmesh/protocol.hpp +813 -813
  146. package/src/painlessmesh/router.hpp +338 -322
  147. package/src/painlessmesh/tcp.hpp +71 -71
  148. package/src/painlessmesh/validation.hpp +238 -238
  149. package/src/plugin/performance.hpp +214 -214
  150. package/src/plugin/remote.hpp +64 -64
  151. package/src/scheduler.cpp +10 -10
  152. package/src/wifi.cpp +2 -2
@@ -1,188 +1,188 @@
1
- #ifndef _PAINLESS_MESH_PLUGIN_HPP_
2
- #define _PAINLESS_MESH_PLUGIN_HPP_
3
-
4
- #include "Arduino.h"
5
- #include "painlessmesh/configuration.hpp"
6
-
7
- #include "painlessmesh/router.hpp"
8
-
9
- namespace painlessmesh {
10
-
11
- /** Plugin interface for painlessMesh packages/messages
12
- *
13
- * This interface allows one to design their own messages types/packages, and
14
- * add handlers that are called when the new package type arrives at a node.
15
- * Here you can think of things like sensor packages, which hold the
16
- * measurements done by the sensors. The packages related to OTA updates are
17
- * also implemented as a plugin system (see plugin::ota). Each package type is
18
- * uniquely identified using the protocol::PackageInterface::type. Currently
19
- * default package types use numbers up to 12, so to be on the safe side we
20
- * recommend your own packages to use higher type values, e.g. start counting at
21
- * 20 at the lowest.
22
- *
23
- * An important piece of information is how a package should be routed.
24
- * Currently we have three main routing algorithms (router::Type).
25
- *
26
- * \code
27
- * using namespace painlessmesh;
28
- *
29
- * // Inherit from SinglePackage, the most basic package with
30
- * router::Type::SINGLE class SensorPackage : public plugin::SinglePackage {
31
- *
32
- * };
33
- *
34
- * \endcode
35
- */
36
- namespace plugin {
37
-
38
- class SinglePackage : public protocol::PackageInterface {
39
- public:
40
- uint32_t from;
41
- uint32_t dest;
42
- router::Type routing;
43
- int type;
44
- int noJsonFields = 4;
45
-
46
- SinglePackage(int type) : routing(router::SINGLE), type(type) {}
47
-
48
- SinglePackage(JsonObject jsonObj) {
49
- from = jsonObj["from"];
50
- dest = jsonObj["dest"];
51
- type = jsonObj["type"];
52
- routing = static_cast<router::Type>(jsonObj["routing"].as<int>());
53
- }
54
-
55
- JsonObject addTo(JsonObject&& jsonObj) const {
56
- jsonObj["from"] = from;
57
- jsonObj["dest"] = dest;
58
- jsonObj["routing"] = static_cast<int>(routing);
59
- jsonObj["type"] = type;
60
- return jsonObj;
61
- }
62
- };
63
-
64
- class BroadcastPackage : public protocol::PackageInterface {
65
- public:
66
- uint32_t from;
67
- router::Type routing;
68
- int type;
69
- int noJsonFields = 3;
70
-
71
- BroadcastPackage(int type) : routing(router::BROADCAST), type(type) {}
72
-
73
- BroadcastPackage(JsonObject jsonObj) {
74
- from = jsonObj["from"];
75
- type = jsonObj["type"];
76
- routing = static_cast<router::Type>(jsonObj["routing"].as<int>());
77
- }
78
-
79
- JsonObject addTo(JsonObject&& jsonObj) const {
80
- jsonObj["from"] = from;
81
- jsonObj["routing"] = static_cast<int>(routing);
82
- jsonObj["type"] = type;
83
- return jsonObj;
84
- }
85
- };
86
-
87
- class NeighbourPackage : public plugin::SinglePackage {
88
- public:
89
- NeighbourPackage(int type) : SinglePackage(type) {
90
- routing = router::NEIGHBOUR;
91
- }
92
-
93
- NeighbourPackage(JsonObject jsonObj) : SinglePackage(jsonObj) {}
94
- };
95
-
96
- /**
97
- * Handle different plugins
98
- *
99
- * Responsible for
100
- * - having a list of plugin types
101
- * - the functions defined to handle the different plugin types
102
- * - tasks?
103
- */
104
- template <typename T>
105
- class PackageHandler : public layout::Layout<T> {
106
- public:
107
- void stop() {
108
- for (auto&& task : taskList) {
109
- task->disable();
110
- task->setCallback(NULL);
111
- }
112
- taskList.clear();
113
- callbackList.clear();
114
- }
115
-
116
- ~PackageHandler() {
117
- if (taskList.size() > 0)
118
- Log(logger::ERROR,
119
- "~PackageHandler(): Always call PackageHandler::stop(scheduler) "
120
- "before calling this destructor");
121
- }
122
-
123
- bool sendPackage(const protocol::PackageInterface* pkg) {
124
- auto variant = protocol::Variant(pkg);
125
- // if single or neighbour with direction
126
- if (variant.routing() == router::SINGLE ||
127
- (variant.routing() == router::NEIGHBOUR && variant.dest() != 0)) {
128
- return router::send(variant, (*this));
129
- }
130
-
131
- // if broadcast or neighbour without direction
132
- if (variant.routing() == router::BROADCAST ||
133
- (variant.routing() == router::NEIGHBOUR && variant.dest() == 0)) {
134
- auto i = router::broadcast(variant, (*this), 0);
135
- if (i > 0) return true;
136
- return false;
137
- }
138
- return false;
139
- }
140
-
141
- void onPackage(int type, std::function<bool(protocol::Variant&)> function) {
142
- auto func = [function](protocol::Variant& var, std::shared_ptr<T>,
143
- uint32_t) { return function(var); };
144
- this->callbackList.onPackage(type, func);
145
- }
146
-
147
- /**
148
- * Add a task to the scheduler
149
- *
150
- * The task will be stored in a list and a shared_ptr to the task will be
151
- * returned. If the task is anonymous (i.e. no shared_ptr to it is held
152
- * anywhere else) and disabled then it will be reused when a new task is
153
- * added.
154
- */
155
- std::shared_ptr<Task> addTask(Scheduler& scheduler, unsigned long aInterval,
156
- long aIterations,
157
- std::function<void()> aCallback) {
158
- using namespace painlessmesh::logger;
159
- for (auto&& task : taskList) {
160
- if (task.use_count() == 1 && !task->isEnabled()) {
161
- task->set(aInterval, aIterations, aCallback, NULL, NULL);
162
- task->enable();
163
- return task;
164
- }
165
- }
166
-
167
- std::shared_ptr<Task> task =
168
- std::make_shared<Task>(aInterval, aIterations, aCallback);
169
- scheduler.addTask((*task));
170
- task->enable();
171
- taskList.push_front(task);
172
- return task;
173
- }
174
-
175
- std::shared_ptr<Task> addTask(Scheduler& scheduler,
176
- std::function<void()> aCallback) {
177
- return this->addTask(scheduler, 0, TASK_ONCE, aCallback);
178
- }
179
-
180
- protected:
181
- callback::MeshPackageCallbackList<T> callbackList;
182
- std::list<std::shared_ptr<Task> > taskList = {};
183
- };
184
-
185
- } // namespace plugin
186
- } // namespace painlessmesh
187
- #endif
188
-
1
+ #ifndef _PAINLESS_MESH_PLUGIN_HPP_
2
+ #define _PAINLESS_MESH_PLUGIN_HPP_
3
+
4
+ #include "Arduino.h"
5
+ #include "painlessmesh/configuration.hpp"
6
+
7
+ #include "painlessmesh/router.hpp"
8
+
9
+ namespace painlessmesh {
10
+
11
+ /** Plugin interface for painlessMesh packages/messages
12
+ *
13
+ * This interface allows one to design their own messages types/packages, and
14
+ * add handlers that are called when the new package type arrives at a node.
15
+ * Here you can think of things like sensor packages, which hold the
16
+ * measurements done by the sensors. The packages related to OTA updates are
17
+ * also implemented as a plugin system (see plugin::ota). Each package type is
18
+ * uniquely identified using the protocol::PackageInterface::type. Currently
19
+ * default package types use numbers up to 12, so to be on the safe side we
20
+ * recommend your own packages to use higher type values, e.g. start counting at
21
+ * 20 at the lowest.
22
+ *
23
+ * An important piece of information is how a package should be routed.
24
+ * Currently we have three main routing algorithms (router::Type).
25
+ *
26
+ * \code
27
+ * using namespace painlessmesh;
28
+ *
29
+ * // Inherit from SinglePackage, the most basic package with
30
+ * router::Type::SINGLE class SensorPackage : public plugin::SinglePackage {
31
+ *
32
+ * };
33
+ *
34
+ * \endcode
35
+ */
36
+ namespace plugin {
37
+
38
+ class SinglePackage : public protocol::PackageInterface {
39
+ public:
40
+ uint32_t from;
41
+ uint32_t dest;
42
+ router::Type routing;
43
+ int type;
44
+ int noJsonFields = 4;
45
+
46
+ SinglePackage(int type) : routing(router::SINGLE), type(type) {}
47
+
48
+ SinglePackage(JsonObject jsonObj) {
49
+ from = jsonObj["from"];
50
+ dest = jsonObj["dest"];
51
+ type = jsonObj["type"];
52
+ routing = static_cast<router::Type>(jsonObj["routing"].as<int>());
53
+ }
54
+
55
+ JsonObject addTo(JsonObject&& jsonObj) const {
56
+ jsonObj["from"] = from;
57
+ jsonObj["dest"] = dest;
58
+ jsonObj["routing"] = static_cast<int>(routing);
59
+ jsonObj["type"] = type;
60
+ return jsonObj;
61
+ }
62
+ };
63
+
64
+ class BroadcastPackage : public protocol::PackageInterface {
65
+ public:
66
+ uint32_t from;
67
+ router::Type routing;
68
+ int type;
69
+ int noJsonFields = 3;
70
+
71
+ BroadcastPackage(int type) : routing(router::BROADCAST), type(type) {}
72
+
73
+ BroadcastPackage(JsonObject jsonObj) {
74
+ from = jsonObj["from"];
75
+ type = jsonObj["type"];
76
+ routing = static_cast<router::Type>(jsonObj["routing"].as<int>());
77
+ }
78
+
79
+ JsonObject addTo(JsonObject&& jsonObj) const {
80
+ jsonObj["from"] = from;
81
+ jsonObj["routing"] = static_cast<int>(routing);
82
+ jsonObj["type"] = type;
83
+ return jsonObj;
84
+ }
85
+ };
86
+
87
+ class NeighbourPackage : public plugin::SinglePackage {
88
+ public:
89
+ NeighbourPackage(int type) : SinglePackage(type) {
90
+ routing = router::NEIGHBOUR;
91
+ }
92
+
93
+ NeighbourPackage(JsonObject jsonObj) : SinglePackage(jsonObj) {}
94
+ };
95
+
96
+ /**
97
+ * Handle different plugins
98
+ *
99
+ * Responsible for
100
+ * - having a list of plugin types
101
+ * - the functions defined to handle the different plugin types
102
+ * - tasks?
103
+ */
104
+ template <typename T>
105
+ class PackageHandler : public layout::Layout<T> {
106
+ public:
107
+ void stop() {
108
+ for (auto&& task : taskList) {
109
+ task->disable();
110
+ task->setCallback(NULL);
111
+ }
112
+ taskList.clear();
113
+ callbackList.clear();
114
+ }
115
+
116
+ ~PackageHandler() {
117
+ if (taskList.size() > 0)
118
+ Log(logger::ERROR,
119
+ "~PackageHandler(): Always call PackageHandler::stop(scheduler) "
120
+ "before calling this destructor");
121
+ }
122
+
123
+ bool sendPackage(const protocol::PackageInterface* pkg) {
124
+ auto variant = protocol::Variant(pkg);
125
+ // if single or neighbour with direction
126
+ if (variant.routing() == router::SINGLE ||
127
+ (variant.routing() == router::NEIGHBOUR && variant.dest() != 0)) {
128
+ return router::send(variant, (*this));
129
+ }
130
+
131
+ // if broadcast or neighbour without direction
132
+ if (variant.routing() == router::BROADCAST ||
133
+ (variant.routing() == router::NEIGHBOUR && variant.dest() == 0)) {
134
+ auto i = router::broadcast(variant, (*this), 0);
135
+ if (i > 0) return true;
136
+ return false;
137
+ }
138
+ return false;
139
+ }
140
+
141
+ void onPackage(int type, std::function<bool(protocol::Variant&)> function) {
142
+ auto func = [function](protocol::Variant& var, std::shared_ptr<T>,
143
+ uint32_t) { return function(var); };
144
+ this->callbackList.onPackage(type, func);
145
+ }
146
+
147
+ /**
148
+ * Add a task to the scheduler
149
+ *
150
+ * The task will be stored in a list and a shared_ptr to the task will be
151
+ * returned. If the task is anonymous (i.e. no shared_ptr to it is held
152
+ * anywhere else) and disabled then it will be reused when a new task is
153
+ * added.
154
+ */
155
+ std::shared_ptr<Task> addTask(Scheduler& scheduler, unsigned long aInterval,
156
+ long aIterations,
157
+ std::function<void()> aCallback) {
158
+ using namespace painlessmesh::logger;
159
+ for (auto&& task : taskList) {
160
+ if (task.use_count() == 1 && !task->isEnabled()) {
161
+ task->set(aInterval, aIterations, aCallback, NULL, NULL);
162
+ task->enable();
163
+ return task;
164
+ }
165
+ }
166
+
167
+ std::shared_ptr<Task> task =
168
+ std::make_shared<Task>(aInterval, aIterations, aCallback);
169
+ scheduler.addTask((*task));
170
+ task->enable();
171
+ taskList.push_front(task);
172
+ return task;
173
+ }
174
+
175
+ std::shared_ptr<Task> addTask(Scheduler& scheduler,
176
+ std::function<void()> aCallback) {
177
+ return this->addTask(scheduler, 0, TASK_ONCE, aCallback);
178
+ }
179
+
180
+ protected:
181
+ callback::MeshPackageCallbackList<T> callbackList;
182
+ std::list<std::shared_ptr<Task> > taskList = {};
183
+ };
184
+
185
+ } // namespace plugin
186
+ } // namespace painlessmesh
187
+ #endif
188
+