1#ifndef _PAINLESS_MESH_PROTOCOL_HPP_
2#define _PAINLESS_MESH_PROTOCOL_HPP_
9#if ARDUINOJSON_VERSION_MAJOR == 7
10#include "ArduinoJson/Deserialization/DeserializationError.hpp"
11#include "ArduinoJson/Document/JsonDocument.hpp"
82 virtual JsonObject
addTo(JsonObject&& jsonObj)
const = 0;
83#if ARDUINOJSON_VERSION_MAJOR < 7
117 dest = jsonObj[
"dest"].as<uint32_t>();
118 from = jsonObj[
"from"].as<uint32_t>();
120 msgId = jsonObj[
"msgId"] | (uint32_t)0;
124 JsonObject
addTo(JsonObject&& jsonObj)
const {
125 jsonObj[
"type"] =
type;
126 jsonObj[
"dest"] =
dest;
127 jsonObj[
"from"] =
from;
128 jsonObj[
"msg"] =
msg;
134#if ARDUINOJSON_VERSION_MAJOR < 7
136 return JSON_OBJECT_SIZE((
msgId != 0 ? 5 : 4) +
138 ceil(1.1 *
msg.length());
152 JsonObject
addTo(JsonObject&& jsonObj)
const {
154 jsonObj[
"type"] =
type;
158#if ARDUINOJSON_VERSION_MAJOR < 7
160 return JSON_OBJECT_SIZE((
msgId != 0 ? 5 : 4) +
162 ceil(1.1 *
msg.length());
177 NodeTree(uint32_t nodeID,
bool iAmRoot,
bool timeAuthority =
false) {
184#if ARDUINOJSON_VERSION_MAJOR < 7
185 if (jsonObj.containsKey(
"root"))
root = jsonObj[
"root"].as<
bool>();
186 if (jsonObj.containsKey(
"hasTimeAuthority"))
hasTimeAuthority = jsonObj[
"hasTimeAuthority"].as<bool>();
187 if (jsonObj.containsKey(
"nodeId"))
190 if (jsonObj[
"root"].is<bool>())
root = jsonObj[
"root"].as<bool>();
191 if (jsonObj[
"hasTimeAuthority"].is<bool>())
hasTimeAuthority = jsonObj[
"hasTimeAuthority"].as<bool>();
192 if (jsonObj[
"nodeId"].is<uint32_t>())
194 nodeId = jsonObj[
"nodeId"].as<uint32_t>();
196 nodeId = jsonObj[
"from"].as<uint32_t>();
198#if ARDUINOJSON_VERSION_MAJOR < 7
199 if (jsonObj.containsKey(
"subs")) {
201 if (jsonObj[
"subs"].is<JsonArray>()) {
203 auto jsonArr = jsonObj[
"subs"].as<JsonArray>();
204 for (
size_t i = 0; i < jsonArr.size(); ++i) {
210 JsonObject
addTo(JsonObject&& jsonObj)
const {
211 jsonObj[
"nodeId"] =
nodeId;
214 if (
subs.size() > 0) {
215#if ARDUINOJSON_VERSION_MAJOR == 7
216 JsonArray subsArr = jsonObj[
"subs"].to<JsonArray>();
218 JsonArray subsArr = jsonObj.createNestedArray(
"subs");
220 for (
auto&& s :
subs) {
221#if ARDUINOJSON_VERSION_MAJOR == 7
222 JsonObject subObj = subsArr.add<JsonObject>();
224 JsonObject subObj = subsArr.createNestedObject();
226 subObj = s.addTo(std::move(subObj));
233 if (!(this->nodeId == b.
nodeId && this->root == b.
root &&
235 this->subs.size() == b.
subs.size()))
237 auto itA = this->subs.begin();
238 auto itB = b.
subs.begin();
239 for (
size_t i = 0; i < this->subs.size(); ++i) {
240 if ((*itA) != (*itB)) {
253#if ARDUINOJSON_VERSION_MAJOR < 7
258 if (
subs.size() > 0) ++base;
259 size_t size = JSON_OBJECT_SIZE(base);
260 if (
subs.size() > 0) size += JSON_ARRAY_SIZE(
subs.size());
261 for (
auto&& s :
subs) size += s.jsonObjectSize();
285 bool iAmRoot =
false) {
294 dest = jsonObj[
"dest"].as<uint32_t>();
295 from = jsonObj[
"from"].as<uint32_t>();
298 JsonObject
addTo(JsonObject&& jsonObj)
const {
299 jsonObj = NodeTree::addTo(std::move(jsonObj));
300 jsonObj[
"type"] = type;
301 jsonObj[
"dest"] = dest;
302 jsonObj[
"from"] = from;
307 if (!(this->from == b.
from && this->dest == b.
dest))
return false;
308 return NodeTree::operator==(b);
312 return !this->operator==(b);
315#if ARDUINOJSON_VERSION_MAJOR < 7
319 if (hasTimeAuthority) ++base;
320 if (subs.size() > 0) ++base;
321 size_t size = JSON_OBJECT_SIZE(base);
322 if (subs.size() > 0) size += JSON_ARRAY_SIZE(subs.size());
323 for (
auto&& s : subs) size += s.jsonObjectSize();
336 using NodeSyncRequest::NodeSyncRequest;
338 JsonObject
addTo(JsonObject&& jsonObj)
const {
339 jsonObj = NodeSyncRequest::addTo(std::move(jsonObj));
340 jsonObj[
"type"] = type;
370 TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0) {
377 TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0, uint32_t t1) {
385 TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0, uint32_t t1,
396 dest = jsonObj[
"dest"].as<uint32_t>();
397 from = jsonObj[
"from"].as<uint32_t>();
398 msg.
type = jsonObj[
"msg"][
"type"].as<
int>();
399#if ARDUINOJSON_VERSION_MAJOR < 7
400 if (jsonObj[
"msg"].containsKey(
"t0"))
401 msg.
t0 = jsonObj[
"msg"][
"t0"].as<uint32_t>();
402 if (jsonObj[
"msg"].containsKey(
"t1"))
403 msg.
t1 = jsonObj[
"msg"][
"t1"].as<uint32_t>();
404 if (jsonObj[
"msg"].containsKey(
"t2"))
405 msg.
t2 = jsonObj[
"msg"][
"t2"].as<uint32_t>();
407 if (jsonObj[
"msg"][
"t0"].is<uint32_t>())
408 msg.
t0 = jsonObj[
"msg"][
"t0"].as<uint32_t>();
409 if (jsonObj[
"msg"][
"t1"].is<uint32_t>())
410 msg.
t1 = jsonObj[
"msg"][
"t1"].as<uint32_t>();
411 if (jsonObj[
"msg"][
"t2"].is<uint32_t>())
412 msg.
t2 = jsonObj[
"msg"][
"t2"].as<uint32_t>();
416 JsonObject
addTo(JsonObject&& jsonObj)
const {
417 jsonObj[
"type"] = type;
418 jsonObj[
"dest"] = dest;
419 jsonObj[
"from"] = from;
420#if ARDUINOJSON_VERSION_MAJOR == 7
421 auto msgObj = jsonObj[
"msg"].to<JsonObject>();
423 auto msgObj = jsonObj.createNestedObject(
"msg");
425 msgObj[
"type"] = msg.
type;
426 if (msg.
type >= 1) msgObj[
"t0"] = msg.
t0;
428 msgObj[
"t1"] = msg.
t1;
429 msgObj[
"t2"] = msg.
t2;
440 std::swap(from, dest);
446 void reply(uint32_t newT1, uint32_t newT2) {
450 std::swap(from, dest);
453#if ARDUINOJSON_VERSION_MAJOR < 7
455 return JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(4);
466 using TimeSync::TimeSync;
468 JsonObject
addTo(JsonObject&& jsonObj)
const {
469 jsonObj = TimeSync::addTo(std::move(jsonObj));
470 jsonObj[
"type"] = type;
488 if (error == DeserializationError::Ok) {
489#if ARDUINOJSON_VERSION_MAJOR == 7
490 jsonBuffer = JsonDocument();
492 jsonBuffer = DynamicJsonDocument(other.jsonBuffer.capacity());
494 jsonBuffer.set(other.jsonBuffer);
495 jsonObj = jsonBuffer.as<JsonObject>();
501 if (
this != &other) {
503 if (error == DeserializationError::Ok) {
504#if ARDUINOJSON_VERSION_MAJOR == 7
505 jsonBuffer = JsonDocument();
507 jsonBuffer = DynamicJsonDocument(other.jsonBuffer.capacity());
509 jsonBuffer.set(other.jsonBuffer);
510 jsonObj = jsonBuffer.as<JsonObject>();
518 : error(std::move(other.error)),
519 jsonBuffer(std::move(other.jsonBuffer)) {
520 if (error == DeserializationError::Ok) {
521 jsonObj = jsonBuffer.as<JsonObject>();
523 other.error = DeserializationError::EmptyInput;
528 if (
this != &other) {
529 error = std::move(other.error);
530 jsonBuffer = std::move(other.jsonBuffer);
531 if (error == DeserializationError::Ok) {
532 jsonObj = jsonBuffer.as<JsonObject>();
534 other.error = DeserializationError::EmptyInput;
538#ifdef ARDUINOJSON_ENABLE_STD_STRING
544 Variant(
const std::string& json)
545#if ARDUINOJSON_VERSION_MAJOR == 7
548 : jsonBuffer(JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(4) +
551 error = deserializeJson(jsonBuffer, json,
552 DeserializationOption::NestingLimit(255));
553 if (error == DeserializationError::Ok)
554 jsonObj = jsonBuffer.as<JsonObject>();
563 Variant(
const std::string& json,
size_t capacity)
564#if ARDUINOJSON_VERSION_MAJOR == 7
567 : jsonBuffer(capacity) {
569 error = deserializeJson(jsonBuffer, json,
570 DeserializationOption::NestingLimit(255));
571 if (error == DeserializationError::Ok)
572 jsonObj = jsonBuffer.as<JsonObject>();
576#ifdef ARDUINOJSON_ENABLE_ARDUINO_STRING
583#if ARDUINOJSON_VERSION_MAJOR == 7
586 : jsonBuffer(JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(4) +
589 error = deserializeJson(jsonBuffer, json,
590 DeserializationOption::NestingLimit(255));
592 if (error == DeserializationError::Ok)
593 jsonObj = jsonBuffer.as<JsonObject>();
602 Variant(String json,
size_t capacity)
603#if ARDUINOJSON_VERSION_MAJOR == 7
606 : jsonBuffer(capacity) {
608 error = deserializeJson(jsonBuffer, json,
609 DeserializationOption::NestingLimit(255));
610 if (!error) jsonObj = jsonBuffer.as<JsonObject>();
617#if ARDUINOJSON_VERSION_MAJOR == 7
622 jsonObj = jsonBuffer.to<JsonObject>();
623 jsonObj = pkg->
addTo(std::move(jsonObj));
632#if ARDUINOJSON_VERSION_MAJOR == 7
637 jsonObj = jsonBuffer.to<JsonObject>();
638 jsonObj = single.
addTo(std::move(jsonObj));
647#if ARDUINOJSON_VERSION_MAJOR == 7
650 : jsonBuffer(broadcast.jsonObjectSize()) {
652 jsonObj = jsonBuffer.to<JsonObject>();
653 jsonObj = broadcast.addTo(std::move(jsonObj));
662#if ARDUINOJSON_VERSION_MAJOR == 7
667 jsonObj = jsonBuffer.to<JsonObject>();
668 jsonObj = nodeTree.
addTo(std::move(jsonObj));
677#if ARDUINOJSON_VERSION_MAJOR == 7
682 jsonObj = jsonBuffer.to<JsonObject>();
683 jsonObj = nodeSyncReply.
addTo(std::move(jsonObj));
692#if ARDUINOJSON_VERSION_MAJOR == 7
697 jsonObj = jsonBuffer.to<JsonObject>();
698 jsonObj = nodeSyncRequest.
addTo(std::move(jsonObj));
707#if ARDUINOJSON_VERSION_MAJOR == 7
712 jsonObj = jsonBuffer.to<JsonObject>();
713 jsonObj = timeSync.
addTo(std::move(jsonObj));
722#if ARDUINOJSON_VERSION_MAJOR == 7
727 jsonObj = jsonBuffer.to<JsonObject>();
728 jsonObj = timeDelay.
addTo(std::move(jsonObj));
734 template <
typename T>
742 template <
typename T>
750 int type() {
return jsonObj[
"type"].as<
int>(); }
758 uint32_t
from() {
return jsonObj[
"from"] | (uint32_t)0; }
766 uint32_t
msgId() {
return jsonObj[
"msgId"] | (uint32_t)0; }
781#if ARDUINOJSON_VERSION_MAJOR < 7
782 if (jsonObj.containsKey(
"routing"))
784 if (jsonObj[
"routing"].is<int>())
788 auto type = this->type();
789 if (type == SINGLE || type ==
TIME_DELAY)
return router::SINGLE;
790 if (type == BROADCAST)
return router::BROADCAST;
793 return router::NEIGHBOUR;
794 return router::ROUTING_ERROR;
801#if ARDUINOJSON_VERSION_MAJOR < 7
802 if (jsonObj.containsKey(
"dest"))
return jsonObj[
"dest"].as<uint32_t>();
804 if (jsonObj[
"dest"].is<uint32_t>())
return jsonObj[
"dest"].as<uint32_t>();
809#ifdef ARDUINOJSON_ENABLE_STD_STRING
815 void printTo(std::string& str,
bool pretty =
false) {
817 serializeJsonPretty(jsonObj, str);
819 serializeJson(jsonObj, str);
823#ifdef ARDUINOJSON_ENABLE_ARDUINO_STRING
829 void printTo(String& str,
bool pretty =
false) {
831 serializeJsonPretty(jsonObj, str);
833 serializeJson(jsonObj, str);
837 DeserializationError error = DeserializationError::Ok;
840#if ARDUINOJSON_VERSION_MAJOR == 7
841 JsonDocument jsonBuffer;
843 DynamicJsonDocument jsonBuffer;
849inline bool Variant::is<Single>() {
850 return jsonObj[
"type"].as<
int>() == SINGLE;
854inline bool Variant::is<Broadcast>() {
855 return jsonObj[
"type"].as<
int>() == BROADCAST;
859inline bool Variant::is<NodeSyncReply>() {
864inline bool Variant::is<NodeSyncRequest>() {
869inline bool Variant::is<TimeSync>() {
870 return jsonObj[
"type"].as<
int>() ==
TIME_SYNC;
874inline bool Variant::is<TimeDelay>() {
875 return jsonObj[
"type"].as<
int>() ==
TIME_DELAY;
879inline JsonObject Variant::to<JsonObject>() {
883inline TSTRING NodeTree::toString(
bool pretty) {
886 variant.printTo(str, pretty);
Definition protocol.hpp:146
size_t jsonObjectSize() const
Definition protocol.hpp:159
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:152
int type
Definition protocol.hpp:148
Definition protocol.hpp:332
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:338
Definition protocol.hpp:277
bool operator==(const NodeSyncRequest &b) const
Definition protocol.hpp:306
uint32_t dest
Definition protocol.hpp:281
NodeSyncRequest()
Definition protocol.hpp:283
NodeSyncRequest(uint32_t fromID, uint32_t destID, std::list< NodeTree > subTree, bool iAmRoot=false)
Definition protocol.hpp:284
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:298
NodeSyncRequest(JsonObject jsonObj)
Definition protocol.hpp:293
bool operator!=(const NodeSyncRequest &b) const
Definition protocol.hpp:311
uint32_t from
Definition protocol.hpp:280
size_t jsonObjectSize() const
Definition protocol.hpp:316
Definition protocol.hpp:167
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:210
TSTRING toString(bool pretty=false)
Definition protocol.hpp:883
std::list< NodeTree > subs
Definition protocol.hpp:172
NodeTree()
Definition protocol.hpp:174
NodeTree(uint32_t nodeID, bool iAmRoot, bool timeAuthority=false)
Definition protocol.hpp:177
bool operator!=(const NodeTree &b) const
Definition protocol.hpp:249
bool hasTimeAuthority
Definition protocol.hpp:171
uint32_t nodeId
Definition protocol.hpp:169
virtual ~NodeTree()=default
NodeTree(JsonObject jsonObj)
Definition protocol.hpp:183
bool root
Definition protocol.hpp:170
bool operator==(const NodeTree &b) const
Definition protocol.hpp:232
void clear()
Definition protocol.hpp:266
size_t jsonObjectSize() const
Definition protocol.hpp:254
Definition protocol.hpp:76
virtual ~PackageInterface()=default
virtual JsonObject addTo(JsonObject &&jsonObj) const =0
virtual size_t jsonObjectSize() const =0
Definition protocol.hpp:93
Single(JsonObject jsonObj)
Definition protocol.hpp:116
Single()
Definition protocol.hpp:109
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:124
uint8_t priority
Definition protocol.hpp:107
uint32_t msgId
Definition protocol.hpp:101
size_t jsonObjectSize() const
Definition protocol.hpp:135
TSTRING msg
Definition protocol.hpp:98
int type
Definition protocol.hpp:95
uint32_t dest
Definition protocol.hpp:97
Single(uint32_t fromID, uint32_t destID, TSTRING &message)
Definition protocol.hpp:110
uint32_t from
Definition protocol.hpp:96
Definition protocol.hpp:463
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:468
Definition protocol.hpp:355
JsonObject addTo(JsonObject &&jsonObj) const
Definition protocol.hpp:416
TimeSync(uint32_t fromID, uint32_t destID)
Definition protocol.hpp:364
void reply(uint32_t newT1, uint32_t newT2)
Definition protocol.hpp:446
void reply(uint32_t newT0)
Definition protocol.hpp:437
size_t jsonObjectSize() const
Definition protocol.hpp:454
TimeSync(JsonObject jsonObj)
Definition protocol.hpp:395
TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0)
Definition protocol.hpp:370
TimeSync()
Definition protocol.hpp:362
time_sync_msg_t msg
Definition protocol.hpp:360
TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0, uint32_t t1, uint32_t t2)
Definition protocol.hpp:385
TimeSync(uint32_t fromID, uint32_t destID, uint32_t t0, uint32_t t1)
Definition protocol.hpp:377
Definition protocol.hpp:481
Variant(const Variant &other)
Definition protocol.hpp:486
Variant(Broadcast broadcast)
Definition protocol.hpp:646
Variant & operator=(const Variant &other)
Definition protocol.hpp:500
bool is()
Definition protocol.hpp:735
Variant(NodeSyncRequest nodeSyncRequest)
Definition protocol.hpp:691
Variant(NodeTree nodeTree)
Definition protocol.hpp:661
int type()
Definition protocol.hpp:750
uint32_t from()
Definition protocol.hpp:758
Variant(NodeSyncReply nodeSyncReply)
Definition protocol.hpp:676
Variant(const PackageInterface *pkg)
Definition protocol.hpp:616
Variant(Variant &&other) noexcept
Definition protocol.hpp:517
Variant(Single single)
Definition protocol.hpp:631
router::Type routing()
Definition protocol.hpp:780
uint32_t msgId()
Definition protocol.hpp:766
Variant(TimeSync timeSync)
Definition protocol.hpp:706
uint32_t dest()
Definition protocol.hpp:800
DeserializationError error
Definition protocol.hpp:837
T to()
Definition protocol.hpp:743
Variant(TimeDelay timeDelay)
Definition protocol.hpp:721
Variant & operator=(Variant &&other) noexcept
Definition protocol.hpp:527
uint8_t priority()
Definition protocol.hpp:775
String TSTRING
Definition configuration.hpp:132
constexpr uint8_t PRIORITY_CRITICAL
Definition protocol.hpp:71
constexpr int GATEWAY_ACK
Definition protocol.hpp:62
constexpr int BRIDGE_COORDINATION
Definition protocol.hpp:57
constexpr int BRIDGE_ELECTION
Definition protocol.hpp:55
constexpr uint8_t PRIORITY_HIGH
Definition protocol.hpp:72
constexpr uint8_t PRIORITY_NORMAL
Definition protocol.hpp:73
constexpr int MESSAGE_ACK
Definition protocol.hpp:66
constexpr uint8_t PRIORITY_LOW
Definition protocol.hpp:74
TimeType
Definition protocol.hpp:45
@ TIME_REPLY
Definition protocol.hpp:49
@ TIME_SYNC_ERROR
Definition protocol.hpp:46
@ TIME_REQUEST
Definition protocol.hpp:48
@ TIME_SYNC_REQUEST
Definition protocol.hpp:47
constexpr int BRIDGE_TAKEOVER
Definition protocol.hpp:56
Type
Definition protocol.hpp:35
@ SINGLE
Definition protocol.hpp:42
@ NODE_SYNC_REPLY
Definition protocol.hpp:39
@ NODE_SYNC_REQUEST
Definition protocol.hpp:38
@ CONTROL
Definition protocol.hpp:40
@ TIME_SYNC
Definition protocol.hpp:37
@ TIME_DELAY
Definition protocol.hpp:36
@ BROADCAST
Definition protocol.hpp:41
constexpr int GATEWAY_HEARTBEAT
Definition protocol.hpp:63
constexpr int GATEWAY_DATA
Definition protocol.hpp:61
constexpr int BRIDGE_STATUS
Definition protocol.hpp:54
Type
Definition protocol.hpp:30
@ ROUTING_ERROR
Definition protocol.hpp:30
@ NEIGHBOUR
Definition protocol.hpp:30
@ SINGLE
Definition protocol.hpp:30
@ BROADCAST
Definition protocol.hpp:30
@ PRIORITY_NORMAL
Definition message_queue.hpp:21
Definition protocol.hpp:345
uint32_t t0
Definition protocol.hpp:347
uint32_t t1
Definition protocol.hpp:348
int type
Definition protocol.hpp:346
uint32_t t2
Definition protocol.hpp:349