1#ifndef PAINLESS_MESH_ACK_HPP
2#define PAINLESS_MESH_ACK_HPP
18#ifndef PAINLESSMESH_MAX_PENDING_ACKS
19#define PAINLESSMESH_MAX_PENDING_ACKS 32
24#ifndef PAINLESSMESH_MAX_QUEUED_BROADCAST_ACKS
25#define PAINLESSMESH_MAX_QUEUED_BROADCAST_ACKS 32
52typedef std::function<void(uint32_t nodeId,
bool delivered, uint32_t latencyMs)>
78 messageId = jsonObj[
"msgId"] | (uint32_t)0;
81 JsonObject
addTo(JsonObject&& jsonObj)
const {
82 jsonObj = SinglePackage::addTo(std::move(jsonObj));
87#if ARDUINOJSON_VERSION_MAJOR < 7
155 bool track(uint32_t msgId,
const std::list<uint32_t>& destinations,
157 if (!callback || destinations.empty())
return false;
160 "AckTracker: pending-ack limit (%u) reached, not tracking %u\n",
168 entry.
waitingFor.insert(destinations.begin(), destinations.end());
169 entries[msgId] = std::move(entry);
180 bool handleAck(uint32_t msgId, uint32_t fromNode, uint32_t now) {
181 std::list<DeliveryResult> results;
182 auto matched =
collectAck(msgId, fromNode, now, results);
183 for (
auto&& result : results) {
184 result.callback(result.nodeId, result.delivered, result.latencyMs);
196 bool collectAck(uint32_t msgId, uint32_t fromNode, uint32_t now,
197 std::list<DeliveryResult>& results) {
199 if (it ==
entries.end())
return false;
200 if (it->second.waitingFor.count(fromNode) == 0)
return false;
201 auto latency = (uint32_t)(now - it->second.sentAt);
202 if (latency >= it->second.timeoutMs) {
206 auto expired = std::move(it->second);
208 for (
auto&& nodeId : expired.waitingFor) {
210 "AckTracker: timeout waiting for ack from %u\n", nodeId);
212 DeliveryResult(expired.callback, nodeId,
false, expired.timeoutMs));
216 it->second.waitingFor.erase(fromNode);
217 auto callback = it->second.callback;
218 if (it->second.waitingFor.empty())
entries.erase(it);
219 results.push_back(
DeliveryResult(callback, fromNode,
true, latency));
230 std::list<DeliveryResult> results;
232 for (
const auto& result : results) {
233 result.callback(result.nodeId, result.delivered, result.latencyMs);
249 std::list<PendingAck> expired;
251 if ((uint32_t)(now - it->second.sentAt) >= it->second.timeoutMs) {
252 expired.push_back(std::move(it->second));
258 for (
auto&& entry : expired) {
259 for (
auto&& nodeId : entry.waitingFor) {
261 "AckTracker: timeout waiting for ack from %u\n", nodeId);
painlessmesh::logger::LogClass Log
Definition wifi.cpp:2
#define PAINLESSMESH_MAX_PENDING_ACKS
Definition ack.hpp:19
size_t collectExpired(uint32_t now, std::list< DeliveryResult > &results)
Definition ack.hpp:244
bool track(uint32_t msgId, const std::list< uint32_t > &destinations, deliveryCallback_t callback, uint32_t timeoutMs, uint32_t now)
Definition ack.hpp:155
std::map< uint32_t, PendingAck > entries
Definition ack.hpp:276
size_t expire(uint32_t now)
Definition ack.hpp:229
bool collectAck(uint32_t msgId, uint32_t fromNode, uint32_t now, std::list< DeliveryResult > &results)
Definition ack.hpp:196
void seed(uint32_t value)
Definition ack.hpp:133
uint32_t counter
Definition ack.hpp:277
bool handleAck(uint32_t msgId, uint32_t fromNode, uint32_t now)
Definition ack.hpp:180
void clear()
Definition ack.hpp:273
bool full() const
Definition ack.hpp:142
uint32_t nextMessageId()
Definition ack.hpp:136
size_t pending() const
Definition ack.hpp:270
MessageAckPackage(uint32_t fromNode, uint32_t destNode, uint32_t msgId)
Definition ack.hpp:70
JsonObject addTo(JsonObject &&jsonObj) const
Definition ack.hpp:81
uint32_t messageId
Definition ack.hpp:66
MessageAckPackage()
Definition ack.hpp:68
size_t jsonObjectSize() const
Definition ack.hpp:88
MessageAckPackage(JsonObject jsonObj)
Definition ack.hpp:77
uint32_t dest
Definition plugin.hpp:46
int noJsonFields
Definition plugin.hpp:49
SinglePackage(int type)
Definition plugin.hpp:51
uint32_t from
Definition plugin.hpp:45
std::function< void(uint32_t nodeId, bool delivered, uint32_t latencyMs)> deliveryCallback_t
Definition ack.hpp:53
@ ERROR
Definition logger.hpp:19
@ COMMUNICATION
Definition logger.hpp:25
DeliveryResult(deliveryCallback_t callback, uint32_t nodeId, bool delivered, uint32_t latencyMs)
Definition ack.hpp:108
deliveryCallback_t callback
Definition ack.hpp:103
uint32_t nodeId
Definition ack.hpp:104
bool delivered
Definition ack.hpp:105
uint32_t latencyMs
Definition ack.hpp:106
uint32_t sentAt
Definition ack.hpp:97
uint32_t timeoutMs
Definition ack.hpp:98
deliveryCallback_t callback
Definition ack.hpp:96
std::set< uint32_t > waitingFor
Definition ack.hpp:99
painlessmesh::logger::LogClass Log
Definition wifi.cpp:2