14#include <esp_idf_version.h>
19static const uint8_t ESPNOW_BROADCAST_ADDR[ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
20static const uint8_t ESPNOW_MULTICAST_ADDR[ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE};
27#ifndef USE_ESPNOW_MAX_PAYLOAD_SIZE
28#define USE_ESPNOW_MAX_PAYLOAD_SIZE ESP_NOW_MAX_DATA_LEN
30static constexpr uint16_t ESPNOW_MAX_DATA_LEN = USE_ESPNOW_MAX_PAYLOAD_SIZE;
31#ifdef ESP_NOW_MAX_DATA_LEN_V2
32static_assert(ESPNOW_MAX_DATA_LEN <= ESP_NOW_MAX_DATA_LEN_V2,
33 "espnow max_payload_size cannot exceed the ESP-NOW v2 frame limit");
35static_assert(ESPNOW_MAX_DATA_LEN <= ESP_NOW_MAX_DATA_LEN,
36 "espnow max_payload_size beyond 250 bytes requires an ESP-IDF with ESP-NOW v2 support (5.4+)");
66#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
88 this->init_sent_data_(mac_addr,
status);
97 struct received_data {
99 uint8_t data[ESPNOW_MAX_DATA_LEN];
117 void init_received_data_(
const esp_now_recv_info_t *
info,
const uint8_t *
data,
int size) {
118 memcpy(this->
packet_.receive.info.src_addr, info->src_addr, ESP_NOW_ETH_ALEN);
119 memcpy(this->
packet_.receive.info.des_addr, info->des_addr, ESP_NOW_ETH_ALEN);
123 this->
packet_.receive.rx_ctrl.rssi = info->rx_ctrl->rssi;
124 this->
packet_.receive.rx_ctrl.timestamp = info->rx_ctrl->timestamp;
126 this->
packet_.receive.info.rx_ctrl =
reinterpret_cast<wifi_pkt_rx_ctrl_t *
>(&this->
packet_.receive.rx_ctrl);
129 void init_sent_data_(
const uint8_t *mac_addr, esp_now_send_status_t
status) {
130 memcpy(this->
packet_.sent.address, mac_addr, ESP_NOW_ETH_ALEN);
139 this->init_data_(peer_address, payload,
size);
142 this->init_data_(peer_address, payload,
size);
155 this->init_data_(peer_address, payload,
size);
159 void load_data(
const uint8_t *peer_address,
const uint8_t *payload,
size_t size) {
160 this->init_data_(peer_address, payload,
size);
165 uint8_t
data_[ESPNOW_MAX_DATA_LEN]{0};
170 void init_data_(
const uint8_t *peer_address,
const uint8_t *payload,
size_t size) {
171 memcpy(this->
address_, peer_address, ESP_NOW_ETH_ALEN);
172 if (
size > ESPNOW_MAX_DATA_LEN) {
ESPNowPacket(const ESPNowPacket &)=delete
uint8_t data[ESPNOW_MAX_DATA_LEN]
esp_now_send_status_t status
void load_sent_data(const uint8_t *mac_addr, esp_now_send_status_t status)
ESPNowPacket & operator=(const ESPNowPacket &)=delete
struct esphome::espnow::ESPNowPacket::@85::received_data receive
void load_received_data(const esp_now_recv_info_t *info, const uint8_t *data, int size)
union esphome::espnow::ESPNowPacket::@85 packet_
esp_now_packet_type_t type_
esp_now_packet_type_t type() const
const ESPNowRecvInfo & get_receive_info() const
ESPNowPacket(const uint8_t *mac_addr, esp_now_send_status_t status)
WifiPacketRxControl rx_ctrl
ESPNowPacket(const esp_now_send_info_t *info, esp_now_send_status_t status)
ESPNowPacket(const esp_now_recv_info_t *info, const uint8_t *data, int size)
struct esphome::espnow::ESPNowPacket::@85::sent_data sent
void load_data(const uint8_t *peer_address, const uint8_t *payload, size_t size, const send_callback_t &callback)
uint8_t data_[ESPNOW_MAX_DATA_LEN]
ESPNowSendPacket & operator=(const ESPNowSendPacket &)=delete
send_callback_t callback_
void load_data(const uint8_t *peer_address, const uint8_t *payload, size_t size)
ESPNowSendPacket(const ESPNowSendPacket &)=delete
uint8_t address_[ESP_NOW_ETH_ALEN]
ESPNowSendPacket(const uint8_t *peer_address, const uint8_t *payload, size_t size, const send_callback_t &&callback)
ESPNowSendPacket(const uint8_t *peer_address, const uint8_t *payload, size_t size)
std::function< void(esp_err_t)> send_callback_t
wifi_pkt_rx_ctrl_t * rx_ctrl
Rx control info of ESPNOW packet.
uint8_t des_addr[ESP_NOW_ETH_ALEN]
Destination address of ESPNOW packet.
uint8_t src_addr[ESP_NOW_ETH_ALEN]
Source address of ESPNOW packet.