summaryrefslogtreecommitdiff
path: root/shared-bindings
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-08-21 11:00:02 -0700
committerScott Shawcroft <scott@tannewt.org>2020-08-21 11:00:02 -0700
commit701e80a0252dbb63d64830a8d55f76b6296cb647 (patch)
tree1d1c9da3050887388f3fc0acd84f82f70f143ffa /shared-bindings
parent80b15f6b3b8bc513e8edcec48a0c97205be27fd3 (diff)
Make socket reads interruptable
Diffstat (limited to 'shared-bindings')
-rw-r--r--shared-bindings/wifi/Radio.c14
-rw-r--r--shared-bindings/wifi/Radio.h10
2 files changed, 22 insertions, 2 deletions
diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c
index 6fd0c3374..2d356e5d9 100644
--- a/shared-bindings/wifi/Radio.c
+++ b/shared-bindings/wifi/Radio.c
@@ -136,9 +136,21 @@ STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_m
password.len = 0;
if (args[ARG_password].u_obj != MP_OBJ_NULL) {
mp_get_buffer_raise(args[ARG_password].u_obj, &password, MP_BUFFER_READ);
+ if (password.len > 0 && (password.len < 8 || password.len > 63)) {
+ mp_raise_ValueError(translate("WiFi password must be between 8 and 63 characters."));
+ }
}
- return mp_obj_new_bool(common_hal_wifi_radio_connect(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, timeout));
+ wifi_radio_error_t error = common_hal_wifi_radio_connect(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, timeout);
+ if (error == WIFI_RADIO_ERROR_AUTH) {
+ mp_raise_ConnectionError(translate("Authentication failure"));
+ } else if (error == WIFI_RADIO_ERROR_NO_AP_FOUND) {
+ mp_raise_ConnectionError(translate("No network with that ssid"));
+ } else if (error != WIFI_RADIO_ERROR_NONE) {
+ mp_raise_ConnectionError(translate("Unknown failure"));
+ }
+
+ return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wifi_radio_connect_obj, 1, wifi_radio_connect);
diff --git a/shared-bindings/wifi/Radio.h b/shared-bindings/wifi/Radio.h
index c83a135a6..812814f9e 100644
--- a/shared-bindings/wifi/Radio.h
+++ b/shared-bindings/wifi/Radio.h
@@ -35,6 +35,14 @@
const mp_obj_type_t wifi_radio_type;
+
+typedef enum {
+ WIFI_RADIO_ERROR_NONE,
+ WIFI_RADIO_ERROR_UNKNOWN,
+ WIFI_RADIO_ERROR_AUTH,
+ WIFI_RADIO_ERROR_NO_AP_FOUND
+} wifi_radio_error_t;
+
extern bool common_hal_wifi_radio_get_enabled(wifi_radio_obj_t *self);
extern void common_hal_wifi_radio_set_enabled(wifi_radio_obj_t *self, bool enabled);
@@ -43,7 +51,7 @@ extern mp_obj_t common_hal_wifi_radio_get_mac_address(wifi_radio_obj_t *self);
extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self);
extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self);
-extern bool common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout);
+extern wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t* ssid, size_t ssid_len, uint8_t* password, size_t password_len, uint8_t channel, mp_float_t timeout);
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);