1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-03 09:18:16 +00:00

add get_channel_for() and change how peer channels are changed.

This commit is contained in:
NP v/d Spek 2024-12-02 12:05:15 +01:00
parent 32b9be9548
commit abfc0256e8
2 changed files with 21 additions and 15 deletions

View File

@ -272,29 +272,29 @@ void ESPNowComponent::set_wifi_channel(uint8_t channel) {
esp_err_t ESPNowComponent::add_peer(uint64_t peer, int8_t channel) { esp_err_t ESPNowComponent::add_peer(uint64_t peer, int8_t channel) {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
int8_t old_channel = this->wifi_channel_;
esp_now_peer_info_t peer_info = {}; esp_now_peer_info_t peer_info = {};
if (this->is_ready()) { if (this->is_ready()) {
if (peer == this->own_peer_address_) { if (peer == this->own_peer_address_) {
ESP_LOGE(TAG, "Tried to peer your self."); ESP_LOGE(TAG, "Tried to pair your self.");
this->mark_failed(); this->mark_failed();
return ESP_ERR_INVALID_MAC; return ESP_ERR_INVALID_MAC;
} }
if (esp_now_is_peer_exist((uint8_t *) &peer)) { if (esp_now_is_peer_exist((uint8_t *) &peer)) {
esp_now_get_peer((const uint8_t *) &peer, &peer_info); result = esp_now_get_peer((const uint8_t *) &peer, &peer_info);
old_channel = peer_info.channel; if (result == ESP_OK) {
result = esp_now_del_peer((uint8_t *) &peer); peer_info.channel = (channel = -1) ? this->wifi_channel_ : channel;
if (result != ESP_OK) result = esp_now_mod_peer((uint8_t *) &peer);
return result; }
} else {
memset(&peer_info, 0, sizeof(esp_now_peer_info_t));
peer_info.channel = (channel = -1) ? this->wifi_channel_ : channel;
peer_info.encrypt = false;
peer_info.ifidx = WIFI_IF_STA;
memcpy((void *) peer_info.peer_addr, (void *) &peer, 6);
esp_err_t result = esp_now_add_peer(&peer_info);
} }
memset(&peer_info, 0, sizeof(esp_now_peer_info_t));
peer_info.channel = (channel = -1) ? old_channel : channel;
peer_info.encrypt = false;
peer_info.ifidx = WIFI_IF_STA;
memcpy((void *) peer_info.peer_addr, (void *) &peer, 6);
esp_err_t result = esp_now_add_peer(&peer_info);
if (result == ESP_OK) { if (result == ESP_OK) {
this->call_on_add_peer_(peer); this->call_on_add_peer_(peer);
} }
@ -535,7 +535,12 @@ void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_
} }
} }
uint8_t ESPNowComponent::get_channel_for_(uint64_t peer) { return 0; } uint8_t ESPNowComponent::get_channel_for(uint64_t peer) {
esp_now_peer_info_t peer_info = {};
esp_now_get_peer((const uint8_t *) &peer, &peer_info);
return peer_info.channel;
}
void ESPNowComponent::update_channel_scan_(ESPNowPacket &packet) {} void ESPNowComponent::update_channel_scan_(ESPNowPacket &packet) {}
void ESPNowComponent::start_multi_cast_() { void ESPNowComponent::start_multi_cast_() {

View File

@ -275,6 +275,8 @@ class ESPNowComponent : public Component {
void handle_internal_commands(ESPNowPacket packet); void handle_internal_commands(ESPNowPacket packet);
void handle_internal_sent(ESPNowPacket packet, bool status); void handle_internal_sent(ESPNowPacket packet, bool status);
uint8_t get_channel_for(uint64_t peer);
protected: protected:
bool validate_channel_(uint8_t channel); bool validate_channel_(uint8_t channel);
@ -300,7 +302,6 @@ class ESPNowComponent : public Component {
void call_on_add_peer_(uint64_t peer); void call_on_add_peer_(uint64_t peer);
void call_on_del_peer_(uint64_t peer); void call_on_del_peer_(uint64_t peer);
uint8_t get_channel_for_(uint64_t peer);
void update_channel_scan_(ESPNowPacket &packet); void update_channel_scan_(ESPNowPacket &packet);
void start_multi_cast_(); void start_multi_cast_();