7#if defined(USE_ESP32) || defined(USE_ESP8266)
14#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
26using peer_address_t = std::array<uint8_t, ESP_NOW_ETH_ALEN>;
28enum class ESPNowTriggers : uint8_t {
37enum ESPNowState : uint8_t {
41 ESPNOW_STATE_DISABLED,
47 uint8_t
address[ESP_NOW_ETH_ALEN];
49 bool operator==(
const ESPNowPeer &other)
const {
return memcmp(this->address, other.address, ESP_NOW_ETH_ALEN) == 0; }
50 bool operator==(
const uint8_t *other)
const {
return memcmp(this->address, other, ESP_NOW_ETH_ALEN) == 0; }
55class ESPNowUnknownPeerHandler {
62 virtual bool on_unknown_peer(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
67class ESPNowReceivedPacketHandler {
74 virtual bool on_receive(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
78class ESPNowBroadcastHandler {
85 virtual bool on_broadcast(
const ESPNowRecvInfo &info,
const uint8_t *data, uint16_t size) = 0;
88#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
89class ESPNowComponent final :
public Component,
public wifi::WiFiConnectStateListener {
91class ESPNowComponent final :
public Component {
95 void setup()
override;
97 void dump_config()
override;
99 float get_setup_priority()
const override {
return setup_priority::LATE; }
104 memcpy(peer.address,
address.data(), ESP_NOW_ETH_ALEN);
105 this->peers_.push_back(peer);
115 void set_wifi_channel(uint8_t channel) { this->wifi_channel_ = channel; }
116 void apply_wifi_channel();
117 void set_channel_from_action(uint8_t channel) {
118 if (this->is_wifi_enabled())
120 this->set_wifi_channel(channel);
121 this->apply_wifi_channel();
123 uint8_t get_wifi_channel();
125 void set_auto_add_peer(
bool value) { this->auto_add_peer_ =
value; }
127#if defined(USE_WIFI) && defined(USE_WIFI_CONNECT_STATE_LISTENERS)
129 void on_wifi_connect_state(StringRef ssid, std::span<const uint8_t, 6> bssid)
override;
134 bool is_disabled()
const {
return this->state_ == ESPNOW_STATE_DISABLED; };
135 void set_enable_on_boot(
bool enable_on_boot) { this->enable_on_boot_ = enable_on_boot; }
136 bool is_wifi_enabled();
147 esp_err_t send(
const uint8_t *peer_address,
const std::vector<uint8_t> &payload, send_callback_t callback =
nullptr) {
148 return this->
send(peer_address, payload.data(), payload.size(), std::move(callback));
150 esp_err_t send(
const uint8_t *peer_address,
const uint8_t *payload,
size_t size, send_callback_t callback =
nullptr);
152 void register_receive_handler(ESPNowReceivedPacketHandler *handler) { this->receive_handlers_.push_back(handler); }
153 void register_unknown_peer_handler(ESPNowUnknownPeerHandler *handler) {
154 this->unknown_peer_handlers_.push_back(handler);
156 void register_broadcast_handler(ESPNowBroadcastHandler *handler) { this->broadcast_handlers_.push_back(handler); }
160 void packet_received(
const uint8_t *src_addr,
const uint8_t *des_addr,
const uint8_t *data,
int size, int8_t rssi,
162 void send_reported(
const uint8_t *mac_addr, esp_now_send_status_t
status);
168 std::vector<ESPNowUnknownPeerHandler *> unknown_peer_handlers_;
169 std::vector<ESPNowReceivedPacketHandler *> receive_handlers_;
170 std::vector<ESPNowBroadcastHandler *> broadcast_handlers_;
172 std::vector<ESPNowPeer> peers_{};
174 uint8_t own_address_[ESP_NOW_ETH_ALEN]{0};
175 LockFreeQueue<ESPNowPacket, MAX_ESP_NOW_RECEIVE_QUEUE_SIZE> receive_packet_queue_{};
179 EventPool<ESPNowPacket, MAX_ESP_NOW_RECEIVE_QUEUE_SIZE - 1> receive_packet_pool_{};
181 LockFreeQueue<ESPNowSendPacket, MAX_ESP_NOW_SEND_QUEUE_SIZE> send_packet_queue_{};
183 EventPool<ESPNowSendPacket, MAX_ESP_NOW_SEND_QUEUE_SIZE - 1> send_packet_pool_{};
184 ESPNowSendPacket *current_send_packet_{
nullptr};
186 uint8_t wifi_channel_{0};
187 ESPNowState state_{ESPNOW_STATE_OFF};
189 bool auto_add_peer_{
false};
190 bool enable_on_boot_{
true};
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,...
value[LAYOUT.day_index()]