diff options
Diffstat (limited to 'extmod/network_ninaw10.c')
| -rw-r--r-- | extmod/network_ninaw10.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/extmod/network_ninaw10.c b/extmod/network_ninaw10.c index f4cc0b222..0852deabe 100644 --- a/extmod/network_ninaw10.c +++ b/extmod/network_ninaw10.c @@ -51,6 +51,9 @@ typedef struct _nina_obj_t { mp_obj_base_t base; bool active; uint32_t itf; + mp_uint_t security; + char ssid[NINA_MAX_SSID_LEN + 1]; + char key[NINA_MAX_WPA_LEN + 1]; } nina_obj_t; // For auto-binding UDP sockets @@ -78,6 +81,7 @@ const mod_network_nic_type_t mod_network_nic_type_nina; static nina_obj_t network_nina_wl_sta = {{(mp_obj_type_t *)&mod_network_nic_type_nina}, false, MOD_NETWORK_STA_IF}; static nina_obj_t network_nina_wl_ap = {{(mp_obj_type_t *)&mod_network_nic_type_nina}, false, MOD_NETWORK_AP_IF}; static mp_sched_node_t mp_wifi_sockpoll_node; +static mp_sched_node_t mp_wifi_connpoll_node; STATIC void network_ninaw10_poll_sockets(mp_sched_node_t *node) { (void)node; @@ -99,6 +103,40 @@ STATIC void network_ninaw10_poll_sockets(mp_sched_node_t *node) { } } +STATIC void network_ninaw10_poll_connect(mp_sched_node_t *node) { + nina_obj_t *self = &network_nina_wl_sta; + + int status = nina_connection_status(); + if (status == NINA_STATUS_CONNECTED) { + // Connected to AP, nothing else to do. + return; + } + + if (status != NINA_STATUS_NO_SSID_AVAIL) { + // If not connected, and no connection in progress, the connection attempt has failed. + // Read the ESP failure reason, reconnect and reschedule the connection polling code. + int reason = nina_connection_reason(); + if (reason == NINA_ESP_REASON_AUTH_EXPIRE || + reason == NINA_ESP_REASON_ASSOC_EXPIRE || + reason == NINA_ESP_REASON_NOT_AUTHED || + reason == NINA_ESP_REASON_4WAY_HANDSHAKE_TIMEOUT || + reason >= NINA_ESP_REASON_BEACON_TIMEOUT) { + debug_printf(&mp_plat_print, "poll_connect() status: %d reason %d\n", status, reason); + if (nina_connect(self->ssid, self->security, self->key, 0) != 0) { + mp_raise_msg_varg(&mp_type_OSError, + MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"), + self->ssid, self->security, self->key); + } + } else { + // Will not attempt to reconnect if there's another error code set. + return; + } + } + + // Reschedule the connection polling code. + mp_sched_schedule_node(&mp_wifi_connpoll_node, network_ninaw10_poll_connect); +} + STATIC mp_obj_t network_ninaw10_timer_callback(mp_obj_t none_in) { if (MP_STATE_PORT(mp_wifi_sockpoll_list) != MP_OBJ_NULL && MP_STATE_PORT(mp_wifi_sockpoll_list)->len) { mp_sched_schedule_node(&mp_wifi_sockpoll_node, network_ninaw10_poll_sockets); @@ -240,6 +278,12 @@ STATIC mp_obj_t network_ninaw10_connect(mp_uint_t n_args, const mp_obj_t *pos_ar mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"), ssid, security, key); } + + // Save connection info to re-connect if needed. + self->security = security; + strncpy(self->key, key, NINA_MAX_WPA_LEN); + strncpy(self->ssid, ssid, NINA_MAX_SSID_LEN); + mp_sched_schedule_node(&mp_wifi_connpoll_node, network_ninaw10_poll_connect); } else { mp_uint_t channel = args[ARG_channel].u_int; @@ -252,6 +296,7 @@ STATIC mp_obj_t network_ninaw10_connect(mp_uint_t n_args, const mp_obj_t *pos_ar mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("failed to start in AP mode")); } } + return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_ninaw10_connect_obj, 1, network_ninaw10_connect); |
