Fix some issues with wifi driver after IDF refactor (#2387)

This commit is contained in:
Otto Winter 2021-09-25 09:16:32 +02:00 committed by GitHub
parent 8503e08ee6
commit 278863d027
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 102 additions and 81 deletions

View file

@ -24,11 +24,7 @@ namespace wifi {
static const char *const TAG = "wifi_esp32"; static const char *const TAG = "wifi_esp32";
static bool s_sta_connected = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) static bool s_sta_connecting = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
static bool s_sta_got_ip = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
static bool s_sta_connect_not_found = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
static bool s_sta_connect_error = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
static bool s_sta_connecting = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
bool WiFiComponent::wifi_mode_(optional<bool> sta, optional<bool> ap) { bool WiFiComponent::wifi_mode_(optional<bool> sta, optional<bool> ap) {
uint8_t current_mode = WiFiClass::getMode(); uint8_t current_mode = WiFiClass::getMode();
@ -122,8 +118,8 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
info.netmask.addr = static_cast<uint32_t>(manual_ip->subnet); info.netmask.addr = static_cast<uint32_t>(manual_ip->subnet);
esp_err_t dhcp_stop_ret = tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA); esp_err_t dhcp_stop_ret = tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
if (dhcp_stop_ret != ESP_OK) { if (dhcp_stop_ret != ESP_OK && dhcp_stop_ret != ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STOPPED) {
ESP_LOGV(TAG, "Stopping DHCP client failed! %d", dhcp_stop_ret); ESP_LOGV(TAG, "Stopping DHCP client failed! %s", esp_err_to_name(dhcp_stop_ret));
} }
esp_err_t wifi_set_info_ret = tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &info); esp_err_t wifi_set_info_ret = tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &info);
@ -280,18 +276,14 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
this->wifi_apply_hostname_(); this->wifi_apply_hostname_();
s_sta_connecting = true;
err = esp_wifi_connect(); err = esp_wifi_connect();
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGW(TAG, "esp_wifi_connect failed! %d", err); ESP_LOGW(TAG, "esp_wifi_connect failed! %d", err);
return false; return false;
} }
s_sta_connecting = true;
s_sta_connected = false;
s_sta_got_ip = false;
s_sta_connect_error = false;
s_sta_connect_not_found = false;
return true; return true;
} }
const char *get_auth_mode_str(uint8_t mode) { const char *get_auth_mode_str(uint8_t mode) {
@ -402,35 +394,78 @@ const char *get_disconnect_reason_str(uint8_t reason) {
return "Unspecified"; return "Unspecified";
} }
} }
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
void WiFiComponent::wifi_event_callback_(arduino_event_id_t event, arduino_event_info_t info) {
#else #define ESPHOME_EVENT_ID_WIFI_READY ARDUINO_EVENT_WIFI_READY
void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_info_t info) { #define ESPHOME_EVENT_ID_WIFI_SCAN_DONE ARDUINO_EVENT_WIFI_SCAN_DONE
#endif #define ESPHOME_EVENT_ID_WIFI_STA_START ARDUINO_EVENT_WIFI_STA_START
#define ESPHOME_EVENT_ID_WIFI_STA_STOP ARDUINO_EVENT_WIFI_STA_STOP
#define ESPHOME_EVENT_ID_WIFI_STA_CONNECTED ARDUINO_EVENT_WIFI_STA_CONNECTED
#define ESPHOME_EVENT_ID_WIFI_STA_DISCONNECTED ARDUINO_EVENT_WIFI_STA_DISCONNECTED
#define ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE
#define ESPHOME_EVENT_ID_WIFI_STA_GOT_IP ARDUINO_EVENT_WIFI_STA_GOT_IP
#define ESPHOME_EVENT_ID_WIFI_STA_GOT_IP6 ARDUINO_EVENT_WIFI_STA_GOT_IP6
#define ESPHOME_EVENT_ID_WIFI_STA_LOST_IP ARDUINO_EVENT_WIFI_STA_LOST_IP
#define ESPHOME_EVENT_ID_WIFI_AP_START ARDUINO_EVENT_WIFI_AP_START
#define ESPHOME_EVENT_ID_WIFI_AP_STOP ARDUINO_EVENT_WIFI_AP_STOP
#define ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED ARDUINO_EVENT_WIFI_AP_STACONNECTED
#define ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED ARDUINO_EVENT_WIFI_AP_STADISCONNECTED
#define ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED
#define ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED
#define ESPHOME_EVENT_ID_WIFI_AP_GOT_IP6 ARDUINO_EVENT_WIFI_AP_GOT_IP6
using esphome_wifi_event_id_t = arduino_event_id_t;
using esphome_wifi_event_info_t = arduino_event_info_t;
#else // ESP_IDF_VERSION_MAJOR >= 4
#define ESPHOME_EVENT_ID_WIFI_READY SYSTEM_EVENT_WIFI_READY
#define ESPHOME_EVENT_ID_WIFI_SCAN_DONE SYSTEM_EVENT_SCAN_DONE
#define ESPHOME_EVENT_ID_WIFI_STA_START SYSTEM_EVENT_STA_START
#define ESPHOME_EVENT_ID_WIFI_STA_STOP SYSTEM_EVENT_STA_STOP
#define ESPHOME_EVENT_ID_WIFI_STA_CONNECTED SYSTEM_EVENT_STA_CONNECTED
#define ESPHOME_EVENT_ID_WIFI_STA_DISCONNECTED SYSTEM_EVENT_STA_DISCONNECTED
#define ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE SYSTEM_EVENT_STA_AUTHMODE_CHANGE
#define ESPHOME_EVENT_ID_WIFI_STA_GOT_IP SYSTEM_EVENT_STA_GOT_IP
#define ESPHOME_EVENT_ID_WIFI_STA_LOST_IP SYSTEM_EVENT_STA_LOST_IP
#define ESPHOME_EVENT_ID_WIFI_AP_START SYSTEM_EVENT_AP_START
#define ESPHOME_EVENT_ID_WIFI_AP_STOP SYSTEM_EVENT_AP_STOP
#define ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED SYSTEM_EVENT_AP_STACONNECTED
#define ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED SYSTEM_EVENT_AP_STADISCONNECTED
#define ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED SYSTEM_EVENT_AP_STAIPASSIGNED
#define ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED SYSTEM_EVENT_AP_PROBEREQRECVED
using esphome_wifi_event_id_t = system_event_id_t;
using esphome_wifi_event_info_t = system_event_info_t;
#endif // !(ESP_IDF_VERSION_MAJOR >= 4)
void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_wifi_event_info_t info) {
switch (event) { switch (event) {
case SYSTEM_EVENT_WIFI_READY: { case ESPHOME_EVENT_ID_WIFI_READY: {
ESP_LOGV(TAG, "Event: WiFi ready"); ESP_LOGV(TAG, "Event: WiFi ready");
break; break;
} }
case SYSTEM_EVENT_SCAN_DONE: { case ESPHOME_EVENT_ID_WIFI_SCAN_DONE: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_scan_done; auto it = info.wifi_scan_done;
#else #else
auto it = info.scan_done; auto it = info.scan_done;
#endif #endif
ESP_LOGV(TAG, "Event: WiFi Scan Done status=%u number=%u scan_id=%u", it.status, it.number, it.scan_id); ESP_LOGV(TAG, "Event: WiFi Scan Done status=%u number=%u scan_id=%u", it.status, it.number, it.scan_id);
this->wifi_scan_done_callback_();
break; break;
} }
case SYSTEM_EVENT_STA_START: { case ESPHOME_EVENT_ID_WIFI_STA_START: {
ESP_LOGV(TAG, "Event: WiFi STA start"); ESP_LOGV(TAG, "Event: WiFi STA start");
tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, App.get_name().c_str()); tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, App.get_name().c_str());
break; break;
} }
case SYSTEM_EVENT_STA_STOP: { case ESPHOME_EVENT_ID_WIFI_STA_STOP: {
ESP_LOGV(TAG, "Event: WiFi STA stop"); ESP_LOGV(TAG, "Event: WiFi STA stop");
break; break;
} }
case SYSTEM_EVENT_STA_CONNECTED: { case ESPHOME_EVENT_ID_WIFI_STA_CONNECTED: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_sta_connected; auto it = info.wifi_sta_connected;
#else #else
@ -441,10 +476,10 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
buf[it.ssid_len] = '\0'; buf[it.ssid_len] = '\0';
ESP_LOGV(TAG, "Event: Connected ssid='%s' bssid=" LOG_SECRET("%s") " channel=%u, authmode=%s", buf, ESP_LOGV(TAG, "Event: Connected ssid='%s' bssid=" LOG_SECRET("%s") " channel=%u, authmode=%s", buf,
format_mac_addr(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode)); format_mac_addr(it.bssid).c_str(), it.channel, get_auth_mode_str(it.authmode));
s_sta_connected = true;
break; break;
} }
case SYSTEM_EVENT_STA_DISCONNECTED: { case ESPHOME_EVENT_ID_WIFI_STA_DISCONNECTED: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_sta_disconnected; auto it = info.wifi_sta_disconnected;
#else #else
@ -455,17 +490,26 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
buf[it.ssid_len] = '\0'; buf[it.ssid_len] = '\0';
if (it.reason == WIFI_REASON_NO_AP_FOUND) { if (it.reason == WIFI_REASON_NO_AP_FOUND) {
ESP_LOGW(TAG, "Event: Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf); ESP_LOGW(TAG, "Event: Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf);
s_sta_connect_not_found = true;
} else { } else {
ESP_LOGW(TAG, "Event: Disconnected ssid='%s' bssid=" LOG_SECRET("%s") " reason='%s'", buf, ESP_LOGW(TAG, "Event: Disconnected ssid='%s' bssid=" LOG_SECRET("%s") " reason='%s'", buf,
format_mac_addr(it.bssid).c_str(), get_disconnect_reason_str(it.reason)); format_mac_addr(it.bssid).c_str(), get_disconnect_reason_str(it.reason));
s_sta_connect_error = true;
} }
s_sta_connected = false;
uint8_t reason = it.reason;
if (reason == WIFI_REASON_AUTH_EXPIRE || reason == WIFI_REASON_BEACON_TIMEOUT ||
reason == WIFI_REASON_NO_AP_FOUND || reason == WIFI_REASON_ASSOC_FAIL ||
reason == WIFI_REASON_HANDSHAKE_TIMEOUT) {
err_t err = esp_wifi_disconnect();
if (err != ESP_OK) {
ESP_LOGV(TAG, "Disconnect failed: %s", esp_err_to_name(err));
}
this->error_from_callback_ = true;
}
s_sta_connecting = false; s_sta_connecting = false;
break; break;
} }
case SYSTEM_EVENT_STA_AUTHMODE_CHANGE: { case ESPHOME_EVENT_ID_WIFI_STA_AUTHMODE_CHANGE: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_sta_authmode_change; auto it = info.wifi_sta_authmode_change;
#else #else
@ -487,27 +531,26 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
} }
break; break;
} }
case SYSTEM_EVENT_STA_GOT_IP: { case ESPHOME_EVENT_ID_WIFI_STA_GOT_IP: {
auto it = info.got_ip.ip_info; auto it = info.got_ip.ip_info;
ESP_LOGV(TAG, "Event: Got IP static_ip=%s gateway=%s", format_ip4_addr(it.ip).c_str(), ESP_LOGV(TAG, "Event: Got IP static_ip=%s gateway=%s", format_ip4_addr(it.ip).c_str(),
format_ip4_addr(it.gw).c_str()); format_ip4_addr(it.gw).c_str());
s_sta_got_ip = true; s_sta_connecting = false;
break; break;
} }
case SYSTEM_EVENT_STA_LOST_IP: { case ESPHOME_EVENT_ID_WIFI_STA_LOST_IP: {
ESP_LOGV(TAG, "Event: Lost IP"); ESP_LOGV(TAG, "Event: Lost IP");
s_sta_got_ip = false;
break; break;
} }
case SYSTEM_EVENT_AP_START: { case ESPHOME_EVENT_ID_WIFI_AP_START: {
ESP_LOGV(TAG, "Event: WiFi AP start"); ESP_LOGV(TAG, "Event: WiFi AP start");
break; break;
} }
case SYSTEM_EVENT_AP_STOP: { case ESPHOME_EVENT_ID_WIFI_AP_STOP: {
ESP_LOGV(TAG, "Event: WiFi AP stop"); ESP_LOGV(TAG, "Event: WiFi AP stop");
break; break;
} }
case SYSTEM_EVENT_AP_STACONNECTED: { case ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_sta_connected; auto it = info.wifi_sta_connected;
auto &mac = it.bssid; auto &mac = it.bssid;
@ -518,7 +561,7 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
ESP_LOGV(TAG, "Event: AP client connected MAC=%s", format_mac_addr(mac).c_str()); ESP_LOGV(TAG, "Event: AP client connected MAC=%s", format_mac_addr(mac).c_str());
break; break;
} }
case SYSTEM_EVENT_AP_STADISCONNECTED: { case ESPHOME_EVENT_ID_WIFI_AP_STADISCONNECTED: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_sta_disconnected; auto it = info.wifi_sta_disconnected;
auto &mac = it.bssid; auto &mac = it.bssid;
@ -529,11 +572,11 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
ESP_LOGV(TAG, "Event: AP client disconnected MAC=%s", format_mac_addr(mac).c_str()); ESP_LOGV(TAG, "Event: AP client disconnected MAC=%s", format_mac_addr(mac).c_str());
break; break;
} }
case SYSTEM_EVENT_AP_STAIPASSIGNED: { case ESPHOME_EVENT_ID_WIFI_AP_STAIPASSIGNED: {
ESP_LOGV(TAG, "Event: AP client assigned IP"); ESP_LOGV(TAG, "Event: AP client assigned IP");
break; break;
} }
case SYSTEM_EVENT_AP_PROBEREQRECVED: { case ESPHOME_EVENT_ID_WIFI_AP_PROBEREQRECVED: {
#if ESP_IDF_VERSION_MAJOR >= 4 #if ESP_IDF_VERSION_MAJOR >= 4
auto it = info.wifi_ap_probereqrecved; auto it = info.wifi_ap_probereqrecved;
#else #else
@ -545,31 +588,6 @@ void WiFiComponent::wifi_event_callback_(system_event_id_t event, system_event_i
default: default:
break; break;
} }
#if ESP_IDF_VERSION_MAJOR >= 4
if (event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) {
uint8_t reason = info.wifi_sta_disconnected.reason;
#else
if (event == SYSTEM_EVENT_STA_DISCONNECTED) {
uint8_t reason = info.disconnected.reason;
#endif
if (reason == WIFI_REASON_AUTH_EXPIRE || reason == WIFI_REASON_BEACON_TIMEOUT ||
reason == WIFI_REASON_NO_AP_FOUND || reason == WIFI_REASON_ASSOC_FAIL ||
reason == WIFI_REASON_HANDSHAKE_TIMEOUT) {
err_t err = esp_wifi_disconnect();
if (err != ESP_OK) {
ESP_LOGV(TAG, "Disconnect failed: %s", esp_err_to_name(err));
}
this->error_from_callback_ = true;
}
}
#if ESP_IDF_VERSION_MAJOR >= 4
if (event == ARDUINO_EVENT_WIFI_SCAN_DONE) {
#else
if (event == SYSTEM_EVENT_SCAN_DONE) {
#endif
this->wifi_scan_done_callback_();
}
} }
void WiFiComponent::wifi_pre_setup_() { void WiFiComponent::wifi_pre_setup_() {
auto f = std::bind(&WiFiComponent::wifi_event_callback_, this, std::placeholders::_1, std::placeholders::_2); auto f = std::bind(&WiFiComponent::wifi_event_callback_, this, std::placeholders::_1, std::placeholders::_2);
@ -579,16 +597,14 @@ void WiFiComponent::wifi_pre_setup_() {
this->wifi_mode_(false, false); this->wifi_mode_(false, false);
} }
WiFiSTAConnectStatus WiFiComponent::wifi_sta_connect_status_() { WiFiSTAConnectStatus WiFiComponent::wifi_sta_connect_status_() {
if (s_sta_connected && s_sta_got_ip) { auto status = WiFiClass::status();
if (status == WL_CONNECTED) {
return WiFiSTAConnectStatus::CONNECTED; return WiFiSTAConnectStatus::CONNECTED;
} } else if (status == WL_CONNECT_FAILED || status == WL_CONNECTION_LOST || status == WL_DISCONNECTED) {
if (s_sta_connect_error) {
return WiFiSTAConnectStatus::ERROR_CONNECT_FAILED; return WiFiSTAConnectStatus::ERROR_CONNECT_FAILED;
} } else if (status == WL_NO_SSID_AVAIL) {
if (s_sta_connect_not_found) {
return WiFiSTAConnectStatus::ERROR_NETWORK_NOT_FOUND; return WiFiSTAConnectStatus::ERROR_NETWORK_NOT_FOUND;
} } else if (s_sta_connecting) {
if (s_sta_connecting) {
return WiFiSTAConnectStatus::CONNECTING; return WiFiSTAConnectStatus::CONNECTING;
} }
return WiFiSTAConnectStatus::IDLE; return WiFiSTAConnectStatus::IDLE;

View file

@ -309,6 +309,14 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
this->wifi_apply_hostname_(); this->wifi_apply_hostname_();
// Reset flags, do this _before_ wifi_station_connect as the callback method
// may be called from wifi_station_connect
s_sta_connecting = true;
s_sta_connected = false;
s_sta_got_ip = false;
s_sta_connect_error = false;
s_sta_connect_not_found = false;
ETS_UART_INTR_DISABLE(); ETS_UART_INTR_DISABLE();
ret = wifi_station_connect(); ret = wifi_station_connect();
ETS_UART_INTR_ENABLE(); ETS_UART_INTR_ENABLE();
@ -325,12 +333,6 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
} }
} }
s_sta_connecting = true;
s_sta_connected = false;
s_sta_got_ip = false;
s_sta_connect_error = false;
s_sta_connect_not_found = false;
return true; return true;
} }

View file

@ -377,17 +377,20 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
} }
#endif // USE_WIFI_WPA2_EAP #endif // USE_WIFI_WPA2_EAP
// Reset flags, do this _before_ wifi_station_connect as the callback method
// may be called from wifi_station_connect
s_sta_connecting = true;
s_sta_connected = false;
s_sta_got_ip = false;
s_sta_connect_error = false;
s_sta_connect_not_found = false;
err = esp_wifi_connect(); err = esp_wifi_connect();
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGW(TAG, "esp_wifi_connect failed: %s", esp_err_to_name(err)); ESP_LOGW(TAG, "esp_wifi_connect failed: %s", esp_err_to_name(err));
return false; return false;
} }
s_sta_connecting = true;
s_sta_connected = false;
s_sta_got_ip = false;
s_sta_connect_error = false;
s_sta_connect_not_found = false;
return true; return true;
} }