diff --git a/src/common/pico_base/include/pico/error.h b/src/common/pico_base/include/pico/error.h index a5cbc39..2f36e4c 100644 --- a/src/common/pico_base/include/pico/error.h +++ b/src/common/pico_base/include/pico/error.h @@ -22,6 +22,8 @@ enum pico_error_codes { PICO_ERROR_NOT_PERMITTED = -4, PICO_ERROR_INVALID_ARG = -5, PICO_ERROR_IO = -6, + PICO_ERROR_BADAUTH = -7, + PICO_ERROR_CONNECT_FAILED = -8, }; #endif // !__ASSEMBLER__ diff --git a/src/rp2_common/pico_cyw43_arch/cyw43_arch.c b/src/rp2_common/pico_cyw43_arch/cyw43_arch.c index 347a6b1..aaa9c72 100644 --- a/src/rp2_common/pico_cyw43_arch/cyw43_arch.c +++ b/src/rp2_common/pico_cyw43_arch/cyw43_arch.c @@ -76,13 +76,19 @@ int cyw43_arch_wifi_connect_async(const char *ssid, const char *pw, uint32_t aut } // Connect to wireless, return with success when an IP address has been assigned -int cyw43_arch_wifi_connect_until(const char *ssid, const char *pw, uint32_t auth, absolute_time_t until) { +static int cyw43_arch_wifi_connect_until(const char *ssid, const char *pw, uint32_t auth, absolute_time_t until) { int err = cyw43_arch_wifi_connect_async(ssid, pw, auth); if (err) return err; int status = CYW43_LINK_UP + 1; while(status >= 0 && status != CYW43_LINK_UP) { int new_status = cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA); + // If there was no network, keep trying + if (new_status == CYW43_LINK_NONET) { + new_status = CYW43_LINK_JOIN; + err = cyw43_arch_wifi_connect_async(ssid, pw, auth); + if (err) return err; + } if (new_status != status) { status = new_status; CYW43_ARCH_DEBUG("connect status: %s\n", cyw43_tcpip_link_status_name(status)); @@ -94,7 +100,15 @@ int cyw43_arch_wifi_connect_until(const char *ssid, const char *pw, uint32_t aut cyw43_arch_poll(); cyw43_arch_wait_for_work_until(until); } - return status == CYW43_LINK_UP ? 0 : status; + // Turn status into a pico_error_codes, CYW43_LINK_NONET shouldn't happen as we fail with PICO_ERROR_TIMEOUT instead + assert(status == CYW43_LINK_UP || status == CYW43_LINK_BADAUTH || status == CYW43_LINK_FAIL); + if (status == CYW43_LINK_UP) { + return PICO_OK; // success + } else if (status == CYW43_LINK_BADAUTH) { + return PICO_ERROR_BADAUTH; + } else { + return PICO_ERROR_CONNECT_FAILED; + } } int cyw43_arch_wifi_connect_blocking(const char *ssid, const char *pw, uint32_t auth) {