mirror of
https://github.com/esphome/esphome.git
synced 2024-11-30 18:54:14 +01:00
remove the global espnow value and peer address
This commit is contained in:
parent
b6f53a6dba
commit
8ee56d695e
2 changed files with 34 additions and 32 deletions
|
@ -33,7 +33,7 @@ static void application_task(void *param) {
|
||||||
ESPNowComponent *application = (ESPNowComponent *) param;
|
ESPNowComponent *application = (ESPNowComponent *) param;
|
||||||
application->runner();
|
application->runner();
|
||||||
}
|
}
|
||||||
|
ESPNowComponent *ESPNowComponent::static_{nullptr};
|
||||||
/* ESPNowPacket ********************************************************************** */
|
/* ESPNowPacket ********************************************************************** */
|
||||||
|
|
||||||
ESPNowPacket::ESPNowPacket(uint64_t peer, const uint8_t *data, uint8_t size, uint32_t protocol) {
|
ESPNowPacket::ESPNowPacket(uint64_t peer, const uint8_t *data, uint8_t size, uint32_t protocol) {
|
||||||
|
@ -67,11 +67,11 @@ bool ESPNowPacket::is_valid() {
|
||||||
|
|
||||||
/* ESPNowComponent ********************************************************************** */
|
/* ESPNowComponent ********************************************************************** */
|
||||||
|
|
||||||
ESPNowComponent::ESPNowComponent() { global_esp_now = this; }
|
ESPNowComponent::ESPNowComponent() { ESPNowComponent::static_ = this; }
|
||||||
|
|
||||||
void ESPNowComponent::dump_config() {
|
void ESPNowComponent::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "esp_now:");
|
ESP_LOGCONFIG(TAG, "esp_now:");
|
||||||
ESP_LOGCONFIG(TAG, " MAC Address: 0x%12llx.", ESPNOW_ADDR_SELF);
|
ESP_LOGCONFIG(TAG, " MAC Address: 0x%12llx.", this->own_peer_address_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESPNowComponent::show_packet(const std::string &title, ESPNowPacket *packet) {
|
void ESPNowComponent::show_packet(const std::string &title, ESPNowPacket *packet) {
|
||||||
|
@ -145,7 +145,7 @@ void ESPNowComponent::setup() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_wifi_get_mac(WIFI_IF_STA, (uint8_t *) &ESPNOW_ADDR_SELF);
|
esp_wifi_get_mac(WIFI_IF_STA, (uint8_t *) &this->own_peer_address_);
|
||||||
|
|
||||||
for (auto &address : this->peers_) {
|
for (auto &address : this->peers_) {
|
||||||
ESP_LOGI(TAG, "Add peer 0x%12llx.", address);
|
ESP_LOGI(TAG, "Add peer 0x%12llx.", address);
|
||||||
|
@ -198,8 +198,8 @@ esp_err_t ESPNowComponent::del_peer(uint64_t addr) {
|
||||||
|
|
||||||
ESPNowDefaultProtocol *ESPNowComponent::get_default_protocol() {
|
ESPNowDefaultProtocol *ESPNowComponent::get_default_protocol() {
|
||||||
if (this->protocols_[ESPNOW_MAIN_PROTOCOL_ID] == nullptr) {
|
if (this->protocols_[ESPNOW_MAIN_PROTOCOL_ID] == nullptr) {
|
||||||
ESPNowDefaultProtocol *tmp = new ESPNowDefaultProtocol();
|
this->default_protocol_ = new ESPNowDefaultProtocol();
|
||||||
this->register_protocol(tmp);
|
this->register_protocol(this->default_protocol_);
|
||||||
}
|
}
|
||||||
return (ESPNowDefaultProtocol *) this->protocols_[ESPNOW_MAIN_PROTOCOL_ID];
|
return (ESPNowDefaultProtocol *) this->protocols_[ESPNOW_MAIN_PROTOCOL_ID];
|
||||||
}
|
}
|
||||||
|
@ -240,6 +240,10 @@ void ESPNowComponent::on_data_received(const esp_now_recv_info_t *recv_info, con
|
||||||
void ESPNowComponent::on_data_received(const uint8_t *addr, const uint8_t *data, int size)
|
void ESPNowComponent::on_data_received(const uint8_t *addr, const uint8_t *data, int size)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
if (ESPNowComponent::static_ == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool broadcast = false;
|
bool broadcast = false;
|
||||||
wifi_pkt_rx_ctrl_t *rx_ctrl = nullptr;
|
wifi_pkt_rx_ctrl_t *rx_ctrl = nullptr;
|
||||||
|
|
||||||
|
@ -252,7 +256,7 @@ void ESPNowComponent::on_data_received(const uint8_t *addr, const uint8_t *data,
|
||||||
(wifi_promiscuous_pkt_t *) (data - sizeof(wifi_pkt_rx_ctrl_t) - 39); // = sizeof (espnow_frame_format_t)
|
(wifi_promiscuous_pkt_t *) (data - sizeof(wifi_pkt_rx_ctrl_t) - 39); // = sizeof (espnow_frame_format_t)
|
||||||
rx_ctrl = &promiscuous_pkt->rx_ctrl;
|
rx_ctrl = &promiscuous_pkt->rx_ctrl;
|
||||||
#endif
|
#endif
|
||||||
ESPNowPacket *packet = new ESPNowPacket((uint64_t) *addr, data, (uint8_t) size);
|
ESPNowPacket *packet = new ESPNowPacket((uint64_t) *addr, data, (uint8_t) size); // NOLINT
|
||||||
packet->is_broadcast = broadcast;
|
packet->is_broadcast = broadcast;
|
||||||
if (rx_ctrl != nullptr) {
|
if (rx_ctrl != nullptr) {
|
||||||
packet->rssi = rx_ctrl->rssi;
|
packet->rssi = rx_ctrl->rssi;
|
||||||
|
@ -263,7 +267,7 @@ void ESPNowComponent::on_data_received(const uint8_t *addr, const uint8_t *data,
|
||||||
/// this->show_packet("Receive", *packet);
|
/// this->show_packet("Receive", *packet);
|
||||||
|
|
||||||
if (packet->is_valid()) {
|
if (packet->is_valid()) {
|
||||||
xQueueSendToBack(global_esp_now->receive_queue_, (void *) packet, 10);
|
xQueueSendToBack(ESPNowComponent::static_->receive_queue_, (void *) packet, 10);
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGE(TAG, "Invalid ESP-NOW packet received (CRC)");
|
ESP_LOGE(TAG, "Invalid ESP-NOW packet received (CRC)");
|
||||||
}
|
}
|
||||||
|
@ -299,11 +303,11 @@ bool ESPNowComponent::write(ESPNowPacket *packet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESPNowComponent::runner() {
|
void ESPNowComponent::runner() {
|
||||||
ESPNowPacket *packet{nullptr};
|
ESPNowPacket *packet{nullptr}; // NOLINT
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (packet == nullptr) {
|
// if (packet == nullptr) {
|
||||||
packet = new ESPNowPacket();
|
packet = new ESPNowPacket(); // NOLINT
|
||||||
}
|
// }
|
||||||
if (xQueueReceive(this->receive_queue_, (void *) &packet, (TickType_t) 1) == pdTRUE) {
|
if (xQueueReceive(this->receive_queue_, (void *) &packet, (TickType_t) 1) == pdTRUE) {
|
||||||
uint8_t *mac = packet->peer_as_bytes();
|
uint8_t *mac = packet->peer_as_bytes();
|
||||||
|
|
||||||
|
@ -317,9 +321,9 @@ void ESPNowComponent::runner() {
|
||||||
}
|
}
|
||||||
this->defer([this, packet]() { this->on_receive_(packet); });
|
this->defer([this, packet]() { this->on_receive_(packet); });
|
||||||
}
|
}
|
||||||
if (packet == nullptr) {
|
// if (packet == nullptr) {
|
||||||
packet = new ESPNowPacket();
|
packet = new ESPNowPacket(); // NOLINT
|
||||||
}
|
// }
|
||||||
if (xQueueReceive(this->send_queue_, (void *) packet, (TickType_t) 1) == pdTRUE) {
|
if (xQueueReceive(this->send_queue_, (void *) packet, (TickType_t) 1) == pdTRUE) {
|
||||||
if (packet->attempts > MAX_NUMBER_OF_RETRYS) {
|
if (packet->attempts > MAX_NUMBER_OF_RETRYS) {
|
||||||
ESP_LOGW(TAG, "To many send retries. Packet dropped. 0x%04x", packet->sequents());
|
ESP_LOGW(TAG, "To many send retries. Packet dropped. 0x%04x", packet->sequents());
|
||||||
|
@ -352,12 +356,12 @@ void ESPNowComponent::runner() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status) {
|
void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status) {
|
||||||
ESPNowPacket *packet = new ESPNowPacket();
|
if ((ESPNowComponent::static_ == nullptr) || !ESPNowComponent::static_->use_sent_check_) {
|
||||||
if (!global_esp_now->use_sent_check_) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ESPNowPacket *packet = new ESPNowPacket(); // NOLINT
|
||||||
uint64_t mac64 = (uint64_t) *mac_addr;
|
uint64_t mac64 = (uint64_t) *mac_addr;
|
||||||
if (xQueuePeek(global_esp_now->send_queue_, (void *) packet, 10 / portTICK_PERIOD_MS) == pdTRUE) {
|
if (xQueuePeek(ESPNowComponent::static_->send_queue_, (void *) packet, 10 / portTICK_PERIOD_MS) == pdTRUE) {
|
||||||
if (status != ESP_OK) {
|
if (status != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "sent packet failed (0x%04x.%d)", packet->sequents(), packet->attempts);
|
ESP_LOGE(TAG, "sent packet failed (0x%04x.%d)", packet->sequents(), packet->attempts);
|
||||||
} else if (packet->peer != mac64) {
|
} else if (packet->peer != mac64) {
|
||||||
|
@ -365,17 +369,17 @@ void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_
|
||||||
packet->attempts, packet->peer, mac64);
|
packet->attempts, packet->peer, mac64);
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGV(TAG, "Confirm sent (0x%04x.%d)", packet->sequents(), packet->attempts);
|
ESP_LOGV(TAG, "Confirm sent (0x%04x.%d)", packet->sequents(), packet->attempts);
|
||||||
global_esp_now->defer([packet]() {
|
ESPNowComponent::static_->defer([packet]() {
|
||||||
global_esp_now->on_sent_(packet, true);
|
ESPNowComponent::static_->on_sent_(packet, true);
|
||||||
ESPNowPacket tmp;
|
ESPNowPacket tmp;
|
||||||
xQueueReceive(global_esp_now->send_queue_, (void *) &tmp, 10 / portTICK_PERIOD_MS);
|
xQueueReceive(ESPNowComponent::static_->send_queue_, (void *) &tmp, 10 / portTICK_PERIOD_MS);
|
||||||
global_esp_now->unlock();
|
ESPNowComponent::static_->unlock();
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
global_esp_now->defer([packet]() {
|
ESPNowComponent::static_->defer([packet]() {
|
||||||
global_esp_now->on_sent_(packet, false);
|
ESPNowComponent::static_->on_sent_(packet, false);
|
||||||
global_esp_now->unlock();
|
ESPNowComponent::static_->unlock();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -383,13 +387,11 @@ void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_
|
||||||
/* ESPNowProtocol ********************************************************************** */
|
/* ESPNowProtocol ********************************************************************** */
|
||||||
|
|
||||||
bool ESPNowProtocol::write(uint64_t peer, const uint8_t *data, uint8_t len) {
|
bool ESPNowProtocol::write(uint64_t peer, const uint8_t *data, uint8_t len) {
|
||||||
ESPNowPacket *packet = new ESPNowPacket(peer, data, len, this->get_protocol_component_id());
|
ESPNowPacket *packet = new ESPNowPacket(peer, data, len, this->get_protocol_component_id()); // NOLINT
|
||||||
packet->sequents(this->get_next_sequents());
|
packet->sequents(this->get_next_sequents());
|
||||||
return this->parent_->write(packet);
|
return this->parent_->write(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESPNowComponent *global_esp_now = nullptr;
|
|
||||||
|
|
||||||
} // namespace espnow
|
} // namespace espnow
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ namespace espnow {
|
||||||
|
|
||||||
static const uint64_t ESPNOW_BROADCAST_ADDR = 0xFFFFFFFFFFFF;
|
static const uint64_t ESPNOW_BROADCAST_ADDR = 0xFFFFFFFFFFFF;
|
||||||
|
|
||||||
static uint64_t ESPNOW_ADDR_SELF = {0};
|
|
||||||
|
|
||||||
static const uint8_t ESPNOW_DATA_HEADER = 0x00;
|
static const uint8_t ESPNOW_DATA_HEADER = 0x00;
|
||||||
static const uint8_t ESPNOW_DATA_PROTOCOL = 0x03;
|
static const uint8_t ESPNOW_DATA_PROTOCOL = 0x03;
|
||||||
static const uint8_t ESPNOW_DATA_PACKET = 0x07;
|
static const uint8_t ESPNOW_DATA_PACKET = 0x07;
|
||||||
|
@ -231,8 +229,12 @@ class ESPNowComponent : public Component {
|
||||||
|
|
||||||
std::map<uint32_t, ESPNowProtocol *> protocols_{};
|
std::map<uint32_t, ESPNowProtocol *> protocols_{};
|
||||||
std::vector<uint64_t> peers_{};
|
std::vector<uint64_t> peers_{};
|
||||||
|
uint64_t own_peer_address_{0};
|
||||||
|
ESPNowDefaultProtocol *default_protocol_{nullptr};
|
||||||
|
|
||||||
TaskHandle_t espnow_task_handle_{nullptr};
|
TaskHandle_t espnow_task_handle_{nullptr};
|
||||||
|
|
||||||
|
static ESPNowComponent *static_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename... Ts> class SendAction : public Action<Ts...>, public Parented<ESPNowComponent> {
|
template<typename... Ts> class SendAction : public Action<Ts...>, public Parented<ESPNowComponent> {
|
||||||
|
@ -311,8 +313,6 @@ class ESPNowNewPeerTrigger : public Trigger<ESPNowPacket *> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ESPNowComponent *global_esp_now;
|
|
||||||
|
|
||||||
} // namespace espnow
|
} // namespace espnow
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue