summaryrefslogtreecommitdiffstatshomepage
path: root/ports/esp32/network_wlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/esp32/network_wlan.c')
-rw-r--r--ports/esp32/network_wlan.c129
1 files changed, 75 insertions, 54 deletions
diff --git a/ports/esp32/network_wlan.c b/ports/esp32/network_wlan.c
index e56d73b237..63f01dfc25 100644
--- a/ports/esp32/network_wlan.c
+++ b/ports/esp32/network_wlan.c
@@ -41,7 +41,6 @@
#include "esp_wifi.h"
#include "esp_log.h"
-#include "mdns.h"
#if MICROPY_PY_NETWORK_WLAN
@@ -49,8 +48,10 @@
#error WIFI_MODE_STA and WIFI_MODE_AP are supposed to be bitfields!
#endif
-STATIC const wlan_if_obj_t wlan_sta_obj;
-STATIC const wlan_if_obj_t wlan_ap_obj;
+typedef base_if_obj_t wlan_if_obj_t;
+
+STATIC wlan_if_obj_t wlan_sta_obj;
+STATIC wlan_if_obj_t wlan_ap_obj;
// Set to "true" if esp_wifi_start() was called
static bool wifi_started = false;
@@ -75,34 +76,22 @@ static uint8_t wifi_sta_reconnects;
// This function is called by the system-event task and so runs in a different
// thread to the main MicroPython task. It must not raise any Python exceptions.
-void network_wlan_event_handler(system_event_t *event) {
- switch (event->event_id) {
- case SYSTEM_EVENT_STA_START:
+static void network_wlan_wifi_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
+ switch (event_id) {
+ case WIFI_EVENT_STA_START:
ESP_LOGI("wifi", "STA_START");
wifi_sta_reconnects = 0;
break;
- case SYSTEM_EVENT_STA_CONNECTED:
+
+ case WIFI_EVENT_STA_CONNECTED:
ESP_LOGI("network", "CONNECTED");
break;
- case SYSTEM_EVENT_STA_GOT_IP:
- ESP_LOGI("network", "GOT_IP");
- wifi_sta_connected = true;
- wifi_sta_disconn_reason = 0; // Success so clear error. (in case of new error will be replaced anyway)
- #if MICROPY_HW_ENABLE_MDNS_QUERIES || MICROPY_HW_ENABLE_MDNS_RESPONDER
- if (!mdns_initialised) {
- mdns_init();
- #if MICROPY_HW_ENABLE_MDNS_RESPONDER
- mdns_hostname_set(mod_network_hostname);
- mdns_instance_name_set(mod_network_hostname);
- #endif
- mdns_initialised = true;
- }
- #endif
- break;
- case SYSTEM_EVENT_STA_DISCONNECTED: {
+
+ case WIFI_EVENT_STA_DISCONNECTED: {
// This is a workaround as ESP32 WiFi libs don't currently
// auto-reassociate.
- system_event_sta_disconnected_t *disconn = &event->event_info.disconnected;
+
+ wifi_event_sta_disconnected_t *disconn = event_data;
char *message = "";
wifi_sta_disconn_reason = disconn->reason;
switch (disconn->reason) {
@@ -152,20 +141,55 @@ void network_wlan_event_handler(system_event_t *event) {
}
}
+static void network_wlan_ip_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
+ switch (event_id) {
+ case IP_EVENT_STA_GOT_IP:
+ ESP_LOGI("network", "GOT_IP");
+ wifi_sta_connected = true;
+ wifi_sta_disconn_reason = 0; // Success so clear error. (in case of new error will be replaced anyway)
+ #if MICROPY_HW_ENABLE_MDNS_QUERIES || MICROPY_HW_ENABLE_MDNS_RESPONDER
+ if (!mdns_initialised) {
+ mdns_init();
+ #if MICROPY_HW_ENABLE_MDNS_RESPONDER
+ mdns_hostname_set(mod_network_hostname);
+ mdns_instance_name_set(mod_network_hostname);
+ #endif
+ mdns_initialised = true;
+ }
+ #endif
+ break;
+
+ default:
+ break;
+ }
+}
+
STATIC void require_if(mp_obj_t wlan_if, int if_no) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(wlan_if);
if (self->if_id != if_no) {
- mp_raise_msg(&mp_type_OSError, if_no == WIFI_IF_STA ? MP_ERROR_TEXT("STA required") : MP_ERROR_TEXT("AP required"));
+ mp_raise_msg(&mp_type_OSError, if_no == ESP_IF_WIFI_STA ? MP_ERROR_TEXT("STA required") : MP_ERROR_TEXT("AP required"));
}
}
-void esp_initialise_wifi() {
+void esp_initialise_wifi(void) {
static int wifi_initialized = 0;
if (!wifi_initialized) {
+ esp_exceptions(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, network_wlan_wifi_event_handler, NULL, NULL));
+ esp_exceptions(esp_event_handler_instance_register(IP_EVENT, ESP_EVENT_ANY_ID, network_wlan_ip_event_handler, NULL, NULL));
+
+ wlan_sta_obj.base.type = &esp_network_wlan_type;
+ wlan_sta_obj.if_id = ESP_IF_WIFI_STA;
+ wlan_sta_obj.netif = esp_netif_create_default_wifi_sta();
+
+ wlan_ap_obj.base.type = &esp_network_wlan_type;
+ wlan_ap_obj.if_id = ESP_IF_WIFI_AP;
+ wlan_ap_obj.netif = esp_netif_create_default_wifi_ap();
+
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_LOGD("modnetwork", "Initializing WiFi");
esp_exceptions(esp_wifi_init(&cfg));
esp_exceptions(esp_wifi_set_storage(WIFI_STORAGE_RAM));
+
ESP_LOGD("modnetwork", "Initialized");
wifi_initialized = 1;
}
@@ -176,10 +200,10 @@ STATIC mp_obj_t network_wlan_make_new(const mp_obj_type_t *type, size_t n_args,
esp_initialise_wifi();
- int idx = (n_args > 0) ? mp_obj_get_int(args[0]) : WIFI_IF_STA;
- if (idx == WIFI_IF_STA) {
+ int idx = (n_args > 0) ? mp_obj_get_int(args[0]) : ESP_IF_WIFI_STA;
+ if (idx == ESP_IF_WIFI_STA) {
return MP_OBJ_FROM_PTR(&wlan_sta_obj);
- } else if (idx == WIFI_IF_AP) {
+ } else if (idx == ESP_IF_WIFI_AP) {
return MP_OBJ_FROM_PTR(&wlan_ap_obj);
} else {
mp_raise_ValueError(MP_ERROR_TEXT("invalid WLAN interface identifier"));
@@ -196,7 +220,7 @@ STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t *args) {
esp_exceptions(esp_wifi_get_mode(&mode));
}
- int bit = (self->if_id == WIFI_IF_STA) ? WIFI_MODE_STA : WIFI_MODE_AP;
+ int bit = (self->if_id == ESP_IF_WIFI_STA) ? WIFI_MODE_STA : WIFI_MODE_AP;
if (n_args > 1) {
bool active = mp_obj_is_true(args[1]);
@@ -262,7 +286,7 @@ STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp
esp_exceptions(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config));
}
- esp_exceptions(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, mod_network_hostname));
+ esp_exceptions(esp_netif_set_hostname(wlan_sta_obj.netif, mod_network_hostname));
wifi_sta_reconnects = 0;
// connect to the WiFi AP
@@ -285,7 +309,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_disconnect_obj, network_wlan_disco
STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
if (n_args == 1) {
- if (self->if_id == WIFI_IF_STA) {
+ if (self->if_id == ESP_IF_WIFI_STA) {
// Case of no arg is only for the STA interface
if (wifi_sta_connected) {
// Happy path, connected with IP
@@ -310,7 +334,7 @@ STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
switch ((uintptr_t)args[1]) {
case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_stations): {
// return list of connected stations, only if in soft-AP mode
- require_if(args[0], WIFI_IF_AP);
+ require_if(args[0], ESP_IF_WIFI_AP);
wifi_sta_list_t station_list;
esp_exceptions(esp_wifi_ap_get_sta_list(&station_list));
wifi_sta_info_t *stations = (wifi_sta_info_t *)station_list.sta;
@@ -324,7 +348,7 @@ STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
}
case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_rssi): {
// return signal of AP, only in STA mode
- require_if(args[0], WIFI_IF_STA);
+ require_if(args[0], ESP_IF_WIFI_STA);
wifi_ap_record_t info;
esp_exceptions(esp_wifi_sta_get_ap_info(&info));
@@ -383,7 +407,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_scan_obj, network_wlan_scan);
STATIC mp_obj_t network_wlan_isconnected(mp_obj_t self_in) {
wlan_if_obj_t *self = MP_OBJ_TO_PTR(self_in);
- if (self->if_id == WIFI_IF_STA) {
+ if (self->if_id == ESP_IF_WIFI_STA) {
return mp_obj_new_bool(wifi_sta_connected);
} else {
wifi_sta_list_t sta;
@@ -400,7 +424,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
- bool is_wifi = self->if_id == WIFI_IF_AP || self->if_id == WIFI_IF_STA;
+ bool is_wifi = self->if_id == ESP_IF_WIFI_AP || self->if_id == ESP_IF_WIFI_STA;
wifi_config_t cfg;
if (is_wifi) {
@@ -428,7 +452,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
}
case MP_QSTR_ssid:
case MP_QSTR_essid: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
size_t len;
const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
len = MIN(len, sizeof(cfg.ap.ssid));
@@ -437,19 +461,19 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_hidden: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.ssid_hidden = mp_obj_is_true(kwargs->table[i].value);
break;
}
case MP_QSTR_security:
case MP_QSTR_authmode: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.authmode = mp_obj_get_int(kwargs->table[i].value);
break;
}
case MP_QSTR_key:
case MP_QSTR_password: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
size_t len;
const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
len = MIN(len, sizeof(cfg.ap.password) - 1);
@@ -488,13 +512,13 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_max_clients: {
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
cfg.ap.max_connection = mp_obj_get_int(kwargs->table[i].value);
break;
}
case MP_QSTR_reconnects: {
int reconnects = mp_obj_get_int(kwargs->table[i].value);
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
// parameter reconnects == -1 means to retry forever.
// here means conf_wifi_sta_reconnects == 0 to retry forever.
conf_wifi_sta_reconnects = (reconnects == -1) ? 0 : reconnects + 1;
@@ -542,8 +566,8 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_mac: {
uint8_t mac[6];
switch (self->if_id) {
- case WIFI_IF_AP: // fallthrough intentional
- case WIFI_IF_STA:
+ case ESP_IF_WIFI_AP: // fallthrough intentional
+ case ESP_IF_WIFI_STA:
esp_exceptions(esp_wifi_get_mac(self->if_id, mac));
return mp_obj_new_bytes(mac, sizeof(mac));
default:
@@ -553,23 +577,23 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_ssid:
case MP_QSTR_essid:
switch (self->if_id) {
- case WIFI_IF_STA:
+ case ESP_IF_WIFI_STA:
val = mp_obj_new_str((char *)cfg.sta.ssid, strlen((char *)cfg.sta.ssid));
break;
- case WIFI_IF_AP:
+ case ESP_IF_WIFI_AP:
val = mp_obj_new_str((char *)cfg.ap.ssid, cfg.ap.ssid_len);
break;
default:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
}
break;
case MP_QSTR_hidden:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
val = mp_obj_new_bool(cfg.ap.ssid_hidden);
break;
case MP_QSTR_security:
case MP_QSTR_authmode:
- req_if = WIFI_IF_AP;
+ req_if = ESP_IF_WIFI_AP;
val = MP_OBJ_NEW_SMALL_INT(cfg.ap.authmode);
break;
case MP_QSTR_channel: {
@@ -582,7 +606,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
case MP_QSTR_hostname:
case MP_QSTR_dhcp_hostname: {
// TODO: Deprecated. Use network.hostname() instead.
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname));
break;
}
@@ -591,7 +615,7 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_
break;
}
case MP_QSTR_reconnects:
- req_if = WIFI_IF_STA;
+ req_if = ESP_IF_WIFI_STA;
int rec = conf_wifi_sta_reconnects - 1;
val = MP_OBJ_NEW_SMALL_INT(rec);
break;
@@ -654,7 +678,4 @@ MP_DEFINE_CONST_OBJ_TYPE(
locals_dict, &wlan_if_locals_dict
);
-STATIC const wlan_if_obj_t wlan_sta_obj = {{&esp_network_wlan_type}, WIFI_IF_STA};
-STATIC const wlan_if_obj_t wlan_ap_obj = {{&esp_network_wlan_type}, WIFI_IF_AP};
-
#endif // MICROPY_PY_NETWORK_WLAN