Skip to content

Commit 6e350a6

Browse files
authored
Merge pull request #7076 from bill88t/early-wifi
Implement async wifi connection on picow
2 parents bd3ed2e + 47c373e commit 6e350a6

File tree

1 file changed

+29
-20
lines changed
  • ports/raspberrypi/common-hal/wifi

1 file changed

+29
-20
lines changed

ports/raspberrypi/common-hal/wifi/Radio.c

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -173,28 +173,37 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
173173
if (!common_hal_wifi_radio_get_enabled(self)) {
174174
mp_raise_RuntimeError(translate("wifi is not enabled"));
175175
}
176-
unsigned timeout_ms = timeout <= 0 ? 8000 : (unsigned)MAX(0, MICROPY_FLOAT_C_FUN(ceil)(timeout * 1000));
177-
// TODO use connect_async so we can service bg tasks & check for ctrl-c during
176+
177+
size_t timeout_ms = timeout <= 0 ? 8000 : (size_t)MICROPY_FLOAT_C_FUN(ceil)(timeout * 1000);
178+
uint64_t start = port_get_raw_ticks(NULL);
179+
uint64_t deadline = start + timeout_ms;
180+
178181
// connect
179-
int result = cyw43_arch_wifi_connect_timeout_ms((const char *)ssid, (const char *)password, CYW43_AUTH_WPA2_AES_PSK, timeout_ms);
180-
bindings_cyw43_wifi_enforce_pm();
181-
switch (result) {
182-
case 0:
183-
return WIFI_RADIO_ERROR_NONE;
184-
// case CYW43_LINK_DOWN:
185-
// case CYW43_LINK_JOIN:
186-
// case CYW43_LINK_NOIP:
187-
// case CYW43_LINK_UP:
188-
case CYW43_LINK_FAIL:
189-
return WIFI_RADIO_ERROR_CONNECTION_FAIL;
190-
case CYW43_LINK_NONET:
191-
return WIFI_RADIO_ERROR_NO_AP_FOUND;
192-
case CYW43_LINK_BADAUTH:
193-
return WIFI_RADIO_ERROR_AUTH_FAIL;
194-
195-
default:
196-
return WIFI_RADIO_ERROR_UNSPECIFIED;
182+
cyw43_arch_wifi_connect_async((const char *)ssid, (const char *)password, CYW43_AUTH_WPA2_AES_PSK);
183+
184+
while (port_get_raw_ticks(NULL) < deadline) {
185+
RUN_BACKGROUND_TASKS;
186+
if (mp_hal_is_interrupted()) {
187+
break;
188+
}
189+
190+
int result = cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA);
191+
192+
switch (result) {
193+
case CYW43_LINK_UP:
194+
bindings_cyw43_wifi_enforce_pm();
195+
return WIFI_RADIO_ERROR_NONE;
196+
case CYW43_LINK_FAIL:
197+
return WIFI_RADIO_ERROR_CONNECTION_FAIL;
198+
case CYW43_LINK_NONET:
199+
return WIFI_RADIO_ERROR_NO_AP_FOUND;
200+
case CYW43_LINK_BADAUTH:
201+
return WIFI_RADIO_ERROR_AUTH_FAIL;
202+
}
197203
}
204+
205+
// Being here means we either timed out or got interrupted.
206+
return WIFI_RADIO_ERROR_UNSPECIFIED;
198207
}
199208

200209
mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self) {

0 commit comments

Comments
 (0)