@alteriom/painlessmesh 1.6.1
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/CHANGELOG.md +144 -0
- package/LICENSE +674 -0
- package/README.md +434 -0
- package/RELEASE_GUIDE.md +419 -0
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +176 -0
- package/docs/README.md +71 -0
- package/docs/alteriom/overview.md +508 -0
- package/docs/api/core-api.md +607 -0
- package/docs/architecture/mesh-architecture.md +379 -0
- package/docs/architecture/plugin-system.md +517 -0
- package/docs/getting-started/first-mesh.md +410 -0
- package/docs/getting-started/installation.md +275 -0
- package/docs/getting-started/quickstart.md +158 -0
- package/docs/improvements/README.md +69 -0
- package/docs/troubleshooting/common-issues.md +521 -0
- package/docs/troubleshooting/faq.md +473 -0
- package/docs/tutorials/basic-examples.md +718 -0
- package/docs/wiki/API-Reference.md +246 -0
- package/docs/wiki/Complete-Documentation.md +123 -0
- package/examples/alteriom/README.md +82 -0
- package/examples/alteriom/alteriom.ino +186 -0
- package/examples/alteriom/alteriom_sensor_node.ino +184 -0
- package/examples/alteriom/alteriom_sensor_package.hpp +128 -0
- package/examples/alteriom/improved_sensor_node.ino +246 -0
- package/examples/alteriom/platformio.ini +25 -0
- package/examples/basic/basic.ino +66 -0
- package/examples/basic/platformio.ini +25 -0
- package/examples/bridge/bridge.ino +51 -0
- package/examples/bridge/platformio.ini +25 -0
- package/examples/echoNode/echoNode.ino +33 -0
- package/examples/echoNode/platformio.ini +25 -0
- package/examples/logClient/logClient.ino +109 -0
- package/examples/logClient/platformio.ini +25 -0
- package/examples/logServer/logServer.ino +81 -0
- package/examples/logServer/platformio.ini +25 -0
- package/examples/mqttBridge/mqttBridge.ino +118 -0
- package/examples/mqttBridge/platformio.ini +26 -0
- package/examples/namedMesh/namedMesh.ino +97 -0
- package/examples/namedMesh/platformio.ini +25 -0
- package/examples/otaReceiver/otaReceiver.ino +79 -0
- package/examples/otaReceiver/platformio.ini +25 -0
- package/examples/otaSender/nodemcu32s_connections.JPG +0 -0
- package/examples/otaSender/otaSender.ino +151 -0
- package/examples/otaSender/platformio.ini +25 -0
- package/examples/startHere/platformio.ini +25 -0
- package/examples/startHere/startHere.ino +159 -0
- package/examples/webServer/platformio.ini +27 -0
- package/examples/webServer/webServer.ino +89 -0
- package/keywords.txt +49 -0
- package/library.json +34 -0
- package/library.properties +11 -0
- package/package.json +78 -0
- package/src/AlteriomPainlessMesh.h +98 -0
- package/src/arduino/wifi.hpp +365 -0
- package/src/boost/asynctcp.hpp +279 -0
- package/src/painlessMesh.h +70 -0
- package/src/painlessMeshSTA.cpp +236 -0
- package/src/painlessMeshSTA.h +58 -0
- package/src/painlessTaskOptions.h +4 -0
- package/src/painlessmesh/base64.hpp +111 -0
- package/src/painlessmesh/buffer.hpp +229 -0
- package/src/painlessmesh/callback.hpp +91 -0
- package/src/painlessmesh/configuration.hpp +77 -0
- package/src/painlessmesh/connection.hpp +192 -0
- package/src/painlessmesh/layout.hpp +188 -0
- package/src/painlessmesh/logger.hpp +158 -0
- package/src/painlessmesh/memory.hpp +120 -0
- package/src/painlessmesh/mesh.hpp +560 -0
- package/src/painlessmesh/metrics.hpp +323 -0
- package/src/painlessmesh/ntp.hpp +263 -0
- package/src/painlessmesh/ota.hpp +553 -0
- package/src/painlessmesh/plugin.hpp +188 -0
- package/src/painlessmesh/protocol.hpp +813 -0
- package/src/painlessmesh/router.hpp +322 -0
- package/src/painlessmesh/tcp.hpp +71 -0
- package/src/painlessmesh/validation.hpp +239 -0
- package/src/plugin/performance.hpp +214 -0
- package/src/plugin/remote.hpp +64 -0
- package/src/scheduler.cpp +10 -0
- package/src/wifi.cpp +2 -0
|
@@ -0,0 +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
|
+
|