ndn-embeds 0.1.0
Lightweight NDN protocol stack for embedded systems
Loading...
Searching...
No Matches
espnow_face.hpp
Go to the documentation of this file.
1
9#pragma once
10
11#include "ndn/face.hpp"
12
13#include <array>
14#include <cstring>
15
16// Forward declaration for ESP-NOW types
17extern "C" {
18#include "esp_now.h"
19}
20
21namespace ndn {
22
24constexpr size_t ESPNOW_MAX_PAYLOAD = 1470;
25
27constexpr size_t ESPNOW_MAX_PEERS = 20;
28
30constexpr uint8_t BROADCAST_MAC[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
31
37inline FaceId macToFaceId(const uint8_t* mac) {
38 // Use lower 2 bytes (offset by +2 since 0 is invalid)
39 return static_cast<FaceId>(((mac[4] << 8) | mac[5]) + 2);
40}
41
45struct PeerInfo {
46 uint8_t mac[6];
48 bool inUse;
49 uint32_t lastSeen;
50};
51
72class EspNowFace : public Face {
73public:
78 explicit EspNowFace(FaceId faceId = 2);
79
83 ~EspNowFace() override;
84
89 FaceId id() const override { return faceId_; }
90
97 Error start() override;
98
102 void stop() override;
103
111 Error send(const uint8_t* data, size_t len) override;
112
121 Error sendTo(FaceId destFace, const uint8_t* data, size_t len) override;
122
129 Error broadcast(const uint8_t* data, size_t len) override;
130
135 size_t maxPayloadSize() const override { return ESPNOW_MAX_PAYLOAD; }
136
142 FaceId addPeer(const uint8_t* mac);
143
148 void removePeer(FaceId faceId);
149
156 bool getMacAddress(FaceId faceId, uint8_t* mac) const;
157
162 size_t peerCount() const;
163
170 void processReceiveQueue();
171
178 void setMacFilter(const uint8_t* mac);
179
188 void setMacFilters(const uint8_t macs[][6], size_t count);
189
193 void clearMacFilters();
194
199 bool hasMacFilter() const { return macFilterEnabled_; }
200
202 static constexpr size_t MAX_MAC_FILTERS = 4;
203
207 static EspNowFace* instance() { return instance_; }
208
209private:
210 // ESP-NOW callbacks (forwarded from static to instance methods)
211 static void onReceive(const esp_now_recv_info_t* info, const uint8_t* data, int len);
212 static void onSend(const esp_now_send_info_t* info, esp_now_send_status_t status);
213
214 // Receive handling
215 void handleReceive(const uint8_t* srcMac, const uint8_t* data, size_t len);
216
217 // Peer lookup
218 PeerInfo* findPeer(FaceId faceId);
219 PeerInfo* findPeerByMac(const uint8_t* mac);
220 const PeerInfo* findPeer(FaceId faceId) const;
221
222 FaceId faceId_;
223 bool running_ = false;
224
225 // Peer management
226 std::array<PeerInfo, ESPNOW_MAX_PEERS> peers_{};
227
228 // Receive queue (for safely passing data from ISR context)
229 // Reduced from 16 to 8 for v2.0 large payload support (memory saving)
230 static constexpr size_t RX_QUEUE_SIZE = 8;
231 struct RxPacket {
232 uint8_t srcMac[6];
233 uint8_t data[ESPNOW_MAX_PAYLOAD];
234 size_t len;
235 bool valid;
236 };
237 std::array<RxPacket, RX_QUEUE_SIZE> rxQueue_{};
238 volatile size_t rxQueueHead_ = 0;
239 volatile size_t rxQueueTail_ = 0;
240
241 // Static instance (for callbacks)
242 static EspNowFace* instance_;
243
244 // MAC address filters (multiple supported)
245 uint8_t macFilters_[MAX_MAC_FILTERS][6] = {};
246 size_t macFilterCount_ = 0;
247 bool macFilterEnabled_ = false;
248};
249
250} // namespace ndn
ESP-NOW Face.
~EspNowFace() override
Destructor.
static EspNowFace * instance()
Get the static instance (for callbacks)
static constexpr size_t MAX_MAC_FILTERS
Maximum number of filter MACs.
void stop() override
Stop ESP-NOW.
void setMacFilters(const uint8_t macs[][6], size_t count)
Set multiple MAC address filters.
size_t maxPayloadSize() const override
Get maximum payload size.
bool getMacAddress(FaceId faceId, uint8_t *mac) const
Get MAC address from FaceId.
void clearMacFilters()
Clear MAC address filters.
Error send(const uint8_t *data, size_t len) override
Default send (broadcast)
Error start() override
Initialize and start ESP-NOW.
void processReceiveQueue()
Process receive events.
bool hasMacFilter() const
Check if MAC address filter is enabled.
size_t peerCount() const
Get number of registered peers.
void setMacFilter(const uint8_t *mac)
Set MAC address filter (single MAC)
Error sendTo(FaceId destFace, const uint8_t *data, size_t len) override
Unicast send to a specific Face.
EspNowFace(FaceId faceId=2)
Constructor.
FaceId id() const override
Get Face ID.
void removePeer(FaceId faceId)
Remove a peer.
Error broadcast(const uint8_t *data, size_t len) override
Broadcast send.
FaceId addPeer(const uint8_t *mac)
Add a peer.
NDN Face abstract base class.
Definition face.hpp:48
uint16_t FaceId
Face identifier.
Definition common.hpp:96
Error
Error codes.
Definition common.hpp:24
constexpr uint8_t BROADCAST_MAC[6]
Broadcast MAC address.
FaceId macToFaceId(const uint8_t *mac)
Generate FaceId from MAC address.
constexpr size_t ESPNOW_MAX_PEERS
ESP-NOW maximum number of peers.
constexpr size_t ESPNOW_MAX_PAYLOAD
ESP-NOW maximum payload size (v2.0)
NDN Face interface.
Peer information.
uint8_t mac[6]
MAC address.
uint32_t lastSeen
Last received time (ms)
bool inUse
In-use flag.
FaceId faceId
Face ID.