Files
MeshCore/src/helpers/StaticPoolPacketManager.h
T

70 lines
2.7 KiB
C++

#pragma once
#include <Dispatcher.h>
// Zero rejects a candidate as unknown/denied; positive values rank eligible
// scopes, with larger values preferred when received path lengths are equal.
typedef uint8_t (*FloodScopePreference)(const mesh::Packet* packet, void* context);
class PacketQueue {
mesh::Packet** _table;
uint8_t* _pri_table;
uint32_t* _schedule_table;
int _size, _num;
uint32_t _next_schedule;
void rebuildNextTime();
void applyBestFloodTransportScope(mesh::Packet* packet,
FloodScopePreference scope_preference,
void* scope_preference_context) const;
public:
PacketQueue(int max_entries);
mesh::Packet* get(uint32_t now, bool resolve_flood_scope = false,
FloodScopePreference scope_preference = NULL,
void* scope_preference_context = NULL);
mesh::Packet* peek(uint32_t now) const;
bool add(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for);
int count() const { return _num; }
int countBefore(uint32_t now) const;
bool getNextTime(uint32_t now, uint32_t& scheduled_for) const;
mesh::Packet* itemAt(int i) const {
if (i < 0 || i >= _num) return NULL;
return _table[i];
}
mesh::Packet* removeByIdx(int i);
bool reschedule(mesh::Packet* packet, uint32_t scheduled_for);
};
class StaticPoolPacketManager : public mesh::PacketManager {
PacketQueue unused, send_queue, rx_queue;
FloodScopePreference flood_scope_preference;
void* flood_scope_preference_context;
public:
StaticPoolPacketManager(int pool_size);
void setFloodScopePreference(FloodScopePreference preference, void* context) {
flood_scope_preference = preference;
flood_scope_preference_context = context;
}
mesh::Packet* allocNew() override;
void free(mesh::Packet* packet) override;
bool queueOutbound(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for) override;
mesh::Packet* getNextOutbound(uint32_t now) override;
mesh::Packet* peekNextOutbound(uint32_t now) override;
bool deferOutbound(mesh::Packet* packet, uint32_t scheduled_for) override {
return send_queue.reschedule(packet, scheduled_for);
}
int getOutboundCount(uint32_t now) const override;
int getOutboundTotal() const override;
bool getNextOutboundTime(uint32_t now, uint32_t& scheduled_for) const override;
int getFreeCount() const override;
mesh::Packet* getOutboundByIdx(int i) override;
mesh::Packet* removeOutboundByIdx(int i) override;
void queueInbound(mesh::Packet* packet, uint32_t scheduled_for) override;
mesh::Packet* getNextInbound(uint32_t now) override;
bool getNextInboundTime(uint32_t now, uint32_t& scheduled_for) const override;
};