13#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
17#include <esp_idf_version.h>
31static constexpr size_t MAX_ESP_NOW_SEND_QUEUE_SIZE = 16;
32static constexpr size_t MAX_ESP_NOW_RECEIVE_QUEUE_SIZE = 16;
34using peer_address_t = std::array<uint8_t, ESP_NOW_ETH_ALEN>;
36enum class ESPNowTriggers : uint8_t {
45enum ESPNowState : uint8_t {
49 ESPNOW_STATE_DISABLED,
55 uint8_t
address[ESP_NOW_ETH_ALEN];
57 bool operator==(
const ESPNowPeer &other)
const {
return memcmp(this->address, other.address, ESP_NOW_ETH_ALEN) == 0; }
58 bool operator==(
const uint8_t *other)
const {
return memcmp(this->address, other, ESP_NOW_ETH_ALEN) == 0; }
63class ESPNowUnknownPeerHandler {
70 virtual bool on_unknown_peer(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
75class ESPNowReceivedPacketHandler {
82 virtual bool on_receive(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
86class ESPNowBroadcastHandler {
93 virtual bool on_broadcast(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
96#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
97class ESPNowComponent final :
public Component,
public wifi::WiFiConnectStateListener {
99class ESPNowComponent final :
public Component {
103 void setup()
override;
104 void loop()
override;
105 void dump_config()
override;
107 float get_setup_priority()
const override {
return setup_priority::LATE; }
110 void add_peer(peer_address_t
address) {
112 memcpy(peer.address,
address.data(), ESP_NOW_ETH_ALEN);
113 this->peers_.push_back(peer);
116 esp_err_t add_peer(
const uint8_t *peer);
118 esp_err_t del_peer(
const uint8_t *peer);
120 void set_wifi_channel(uint8_t channel) { this->wifi_channel_ = channel; }
121 void apply_wifi_channel();
122 uint8_t get_wifi_channel();
124 void set_auto_add_peer(
bool value) { this->auto_add_peer_ = value; }
126#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
128 void on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid)
override;
133 bool is_disabled()
const {
return this->state_ == ESPNOW_STATE_DISABLED; };
134 void set_enable_on_boot(
bool enable_on_boot) { this->enable_on_boot_ = enable_on_boot; }
135 bool is_wifi_enabled();
146 esp_err_t send(
const uint8_t *peer_address,
const std::vector<uint8_t> &payload,
147 const send_callback_t &callback =
nullptr) {
148 return this->send(peer_address, payload.data(), payload.size(), callback);
150 esp_err_t send(
const uint8_t *peer_address,
const uint8_t *payload,
size_t size,
151 const send_callback_t &callback =
nullptr);
153 void register_receive_handler(ESPNowReceivedPacketHandler *handler) { this->receive_handlers_.push_back(handler); }
154 void register_unknown_peer_handler(ESPNowUnknownPeerHandler *handler) {
155 this->unknown_peer_handlers_.push_back(handler);
157 void register_broadcast_handler(ESPNowBroadcastHandler *handler) { this->broadcast_handlers_.push_back(handler); }
160 friend void on_data_received(
const esp_now_recv_info_t *info,
const uint8_t *data,
int size);
161#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
170 std::vector<ESPNowUnknownPeerHandler *> unknown_peer_handlers_;
171 std::vector<ESPNowReceivedPacketHandler *> receive_handlers_;
172 std::vector<ESPNowBroadcastHandler *> broadcast_handlers_;
174 std::vector<ESPNowPeer> peers_{};
176 uint8_t own_address_[ESP_NOW_ETH_ALEN]{0};
177 LockFreeQueue<ESPNowPacket, MAX_ESP_NOW_RECEIVE_QUEUE_SIZE> receive_packet_queue_{};
181 EventPool<ESPNowPacket, MAX_ESP_NOW_RECEIVE_QUEUE_SIZE - 1> receive_packet_pool_{};
183 LockFreeQueue<ESPNowSendPacket, MAX_ESP_NOW_SEND_QUEUE_SIZE> send_packet_queue_{};
185 EventPool<ESPNowSendPacket, MAX_ESP_NOW_SEND_QUEUE_SIZE - 1> send_packet_pool_{};
186 ESPNowSendPacket *current_send_packet_{
nullptr};
188 uint8_t wifi_channel_{0};
189 ESPNowState state_{ESPNOW_STATE_OFF};
191 bool auto_add_peer_{
false};
192 bool enable_on_boot_{
true};
void on_send_report(const esp_now_send_info_t *info, esp_now_send_status_t status) void on_send_report(const uint8_t *mac_addr
void on_data_received(const esp_now_recv_info_t *info, const uint8_t *data, int size)
ESPNowComponent * global_esp_now
bool operator==(const GainTimePair &lhs, const GainTimePair &rhs)
bool is_disabled()
Return whether the network is disabled: every configured interface with a disable() lifecycle (modem,...