From 6fed24e1b6fce58f2c06328b9bc8b8f9d9512b42 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Mon, 10 Jun 2019 07:18:28 -0400 Subject: [PATCH] WIP --- shared-bindings/bleio/Address.c | 58 +++++---------------------------- shared-bindings/bleio/UUID.c | 5 +-- 2 files changed, 12 insertions(+), 51 deletions(-) diff --git a/shared-bindings/bleio/Address.c b/shared-bindings/bleio/Address.c index b7c76b7b2e..226c011a3d 100644 --- a/shared-bindings/bleio/Address.c +++ b/shared-bindings/bleio/Address.c @@ -53,9 +53,8 @@ STATIC uint8_t xdigit_8b_value(byte nibble1, byte nibble2) { //| Create a new Address object encapsulating the address value. //| The value itself can be one of: //| -//| - a `str` value in the format of 'XXXXXXXXXXXX' or 'XX:XX:XX:XX:XX:XX' (12 hex digits) -//| - a `bytes` or `bytearray` containing 6 bytes -//| - another Address object +//| :param buf: The address value to encapsulate +//| - a buffer object (bytearray, bytes) of 6 bytes //| //| :param address: The address to encapsulate //| @@ -84,54 +83,15 @@ STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t address = args[ARG_address].u_obj; - if (MP_OBJ_IS_STR(address)) { - GET_STR_DATA_LEN(address, str, str_len); - - size_t value_index = 0; - int str_index = str_len; - bool error = false; - - // Loop until fewer than two characters left. - while (str_index >= 1 && value_index < sizeof(self->value)) { - if (str[str_index] == ':') { - // Skip colon separators. - str_index--; - continue; - } - - if (!unichar_isxdigit(str[str_index]) || - !unichar_isxdigit(str[str_index-1])) { - error = true; - break; - } - - self->value[value_index] = xdigit_8b_value(str[str_index], - str[str_index-1]); - value_index += 1; - str_index -= 2; - } - // Check for correct number of hex digits and no parsing errors. - if (error || value_index != ADDRESS_BYTE_LEN || str_index != -1) { - mp_raise_ValueError_varg(translate("Address is not %d bytes long or is in wrong format"), - ADDRESS_BYTE_LEN); - } - } else if (MP_OBJ_IS_TYPE(address, &mp_type_bytearray) || MP_OBJ_IS_TYPE(address, &mp_type_bytes)) { - mp_buffer_info_t buf_info; - mp_get_buffer_raise(address, &buf_info, MP_BUFFER_READ); - if (buf_info.len != BLEIO_ADDRESS_BYTES) { - mp_raise_ValueError_varg(translate("Address must be %d bytes long"), BLEIO_ADDRESS_BYTES); - } - - for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { - self->value[BLEIO_ADDRESS_BYTES - b - 1] = ((uint8_t*)buf_info.buf)[b]; - } - } else if (MP_OBJ_IS_TYPE(address, &bleio_address_type)) { - // deep copy - bleio_address_obj_t *other = MP_OBJ_TO_PTR(address); - self->type = other->type; - memcpy(self->value, other->value, BLEIO_ADDRESS_BYTES); + mp_buffer_info_t buf_info; + mp_get_buffer_raise(address, &buf_info, MP_BUFFER_READ); + if (buf_info.len != BLEIO_ADDRESS_BYTES) { + mp_raise_ValueError_varg(translate("Address must be %d bytes long"), BLEIO_ADDRESS_BYTES); } + for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { + self->value[BLEIO_ADDRESS_BYTES - b - 1] = ((uint8_t*)buf_info.buf)[b]; + } return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/bleio/UUID.c b/shared-bindings/bleio/UUID.c index c6ad9e6266..d054ea7191 100644 --- a/shared-bindings/bleio/UUID.c +++ b/shared-bindings/bleio/UUID.c @@ -48,8 +48,9 @@ //| //| - an `int` value in range 0 to 0xFFFF (Bluetooth SIG 16-bit UUID) //| - a buffer object (bytearray, bytes) of 16 bytes in little-endian order (128-bit UUID) +//| - a string of hex digits of the form 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' //| -//| :param int/buffer value: The uuid value to encapsulate +//| :param value: The uuid value to encapsulate //| STATIC mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { mp_arg_check_num(n_args, kw_args, 1, 1, false); @@ -63,7 +64,7 @@ STATIC mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, co if (MP_OBJ_IS_INT(value)) { mp_int_t uuid16 = mp_obj_get_int(value); if (uuid16 < 0 || uuid16 > 0xffff) { - mp_raise_ValueError(translate("UUID integer value not in range 0 to 0xffff")); + mp_raise_ValueError(translate("UUID integer value must be 0-0xffff")); } // NULL means no 128-bit value.