nrf5/modules: Updating ubluepy with more implementation in UUID and Service. Adding function in bluetooth le driver which adds services to the bluetooth stack. Making service take UUID object and Service type (primary/secondary) as constructor parameter in Service class.

This commit is contained in:
Glenn Ruben Bakke 2017-02-10 21:09:03 +01:00
parent 3223026764
commit fad456d18f
5 changed files with 148 additions and 20 deletions

View File

@ -0,0 +1,59 @@
/*
* This file is part of the Micro Python project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2017 Glenn Ruben Bakke
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef UBLUEPY_H__
#define UBLUEPY_H__
#include "py/obj.h"
extern const mp_obj_type_t ubluepy_uuid_type;
extern const mp_obj_type_t ubluepy_service_type;
typedef enum {
UBLUEPY_UUID_16_BIT,
UBLUEPY_UUID_128_BIT
} ubluepy_uuid_type_t;
typedef enum {
UBLUEPY_SERVICE_PRIMARY = 1,
UBLUEPY_SERVICE_SECONDARY = 2
} ubluepy_service_type_t;
typedef struct _ubluepy_uuid_obj_t {
mp_obj_base_t base;
ubluepy_uuid_type_t type;
uint8_t value[2];
uint8_t uuid_vs_idx;
} ubluepy_uuid_obj_t;
typedef struct _ubluepy_service_obj_t {
mp_obj_base_t base;
uint16_t handle;
uint8_t type;
ubluepy_uuid_obj_t * p_uuid;
} ubluepy_service_obj_t;
#endif // UBLUEPY_H__

View File

@ -25,9 +25,63 @@
*/
#include "py/obj.h"
#include "modubluepy.h"
#include "py/runtime.h"
#include "softdevice.h"
#if MICROPY_PY_UBLUEPY_PERIPHERAL || MICROPY_PY_UBLUEPY_CENTRAL
STATIC void ubluepy_service_print(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind) {
ubluepy_service_obj_t * self = (ubluepy_service_obj_t *)o;
mp_printf(print, "Service(handle: 0x" HEX2_FMT ")", self->handle);
}
STATIC mp_obj_t ubluepy_service_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
enum { ARG_NEW_UUID, ARG_NEW_TYPE };
static const mp_arg_t allowed_args[] = {
{ ARG_NEW_UUID, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
{ ARG_NEW_TYPE, MP_ARG_INT, {.u_int = UBLUEPY_SERVICE_PRIMARY} },
};
// parse args
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
ubluepy_service_obj_t *s = m_new_obj(ubluepy_service_obj_t);
s->base.type = type;
mp_obj_t uuid_obj = args[ARG_NEW_UUID].u_obj;
if (uuid_obj == MP_OBJ_NULL) {
return MP_OBJ_FROM_PTR(s);
}
if (MP_OBJ_IS_TYPE(uuid_obj, &ubluepy_uuid_type)) {
s->p_uuid = MP_OBJ_TO_PTR(uuid_obj);
uint8_t type = args[ARG_NEW_TYPE].u_int;
if (type > 0 && type <= UBLUEPY_SERVICE_PRIMARY) {
s->type = type;
} else {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
"Invalid Service type"));
}
(void)sd_service_add(s);
} else {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
"Invalid UUID parameter"));
}
return MP_OBJ_FROM_PTR(s);
}
STATIC const mp_map_elem_t ubluepy_service_locals_dict_table[] = {
#if 0
{ MP_OBJ_NEW_QSTR(MP_QSTR_getCharacteristic), (mp_obj_t)(&ubluepy_service_get_char_obj) },
@ -36,6 +90,8 @@ STATIC const mp_map_elem_t ubluepy_service_locals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_peripheral), (mp_obj_t)(&ubluepy_service_get_peripheral_obj) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_uuid), (mp_obj_t)(&ubluepy_service_get_uuid_obj) },
#endif
{ MP_OBJ_NEW_QSTR(MP_QSTR_PRIMARY), MP_OBJ_NEW_SMALL_INT(UBLUEPY_SERVICE_PRIMARY) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_SECONDARY), MP_OBJ_NEW_SMALL_INT(UBLUEPY_SERVICE_SECONDARY) },
};
STATIC MP_DEFINE_CONST_DICT(ubluepy_service_locals_dict, ubluepy_service_locals_dict_table);
@ -43,11 +99,9 @@ STATIC MP_DEFINE_CONST_DICT(ubluepy_service_locals_dict, ubluepy_service_locals_
const mp_obj_type_t ubluepy_service_type = {
{ &mp_type_type },
.name = MP_QSTR_Service,
#if 0
.print = ubluepy_service_print,
.make_new = ubluepy_service_make_new,
.locals_dict = (mp_obj_t)&ubluepy_service_locals_dict
#endif
};
#endif // MICROPY_PY_UBLUEPY_PERIPHERAL || MICROPY_PY_UBLUEPY_CENTRAL

View File

@ -29,25 +29,11 @@
#include "py/objstr.h"
#include "py/misc.h"
#include "modubluepy.h"
#include "softdevice.h"
#if MICROPY_PY_UBLUEPY
// farward declare type
const mp_obj_type_t ubluepy_uuid_type;
typedef enum {
UBLUEPY_UUID_16_BIT,
UBLUEPY_UUID_128_BIT
} ubluepy_uuid_type_t;
typedef struct _ubluepy_uuid_obj_t {
mp_obj_base_t base;
ubluepy_uuid_type_t type;
uint8_t value[2];
uint8_t uuid_vs_idx;
} ubluepy_uuid_obj_t;
STATIC void ubluepy_uuid_print(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind) {
ubluepy_uuid_obj_t * self = (ubluepy_uuid_obj_t *)o;
if (self->type == UBLUEPY_UUID_16_BIT) {
@ -59,7 +45,6 @@ STATIC void ubluepy_uuid_print(const mp_print_t *print, mp_obj_t o, mp_print_kin
}
}
#include <stdio.h>
STATIC mp_obj_t ubluepy_uuid_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
enum { ARG_NEW_UUID };
@ -135,14 +120,17 @@ STATIC mp_obj_t ubluepy_uuid_make_new(const mp_obj_type_t *type, size_t n_args,
buffer[15] = unichar_xdigit_value(str_data[1]);
buffer[15] += unichar_xdigit_value(str_data[0]) << 4;
printf("string length 36\n");
sd_uuid_add_vs(s->value, &s->uuid_vs_idx);
} else {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
"Invalid UUID string length"));
}
} else if (MP_OBJ_IS_TYPE(uuid_obj, &ubluepy_uuid_type)) {
printf("copy of UUID object\n");
// deep copy instance
ubluepy_uuid_obj_t * p_old = MP_OBJ_TO_PTR(uuid_obj);
s->type = p_old->type;
s->value[0] = p_old->value[0];
s->value[1] = p_old->value[1];
} else {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
"Invalid UUID parameter"));

View File

@ -217,3 +217,21 @@ bool sd_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx) {
return true;
}
bool sd_service_add(ubluepy_service_obj_t * p_service_obj) {
SD_TEST_OR_ENABLE();
ble_uuid_t uuid;
uuid.type = p_service_obj->p_uuid->type;
uuid.uuid = (uint16_t)(*(uint16_t *)&p_service_obj->p_uuid->value[0]);
if (sd_ble_gatts_service_add(p_service_obj->type,
&uuid,
&p_service_obj->handle) != 0)
{
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
"Can not add Service."));
}
return true;
}

View File

@ -24,9 +24,14 @@
* THE SOFTWARE.
*/
#ifndef BLUETOOTH_LE_DRIVER_H__
#define BLUETOOTH_LE_DRIVER_H__
#include <stdint.h>
#include <stdbool.h>
#include "modubluepy.h"
uint32_t sd_enable(void);
void sd_disable(void);
@ -38,3 +43,7 @@ void sd_address_get(void);
void sd_advertise(void);
bool sd_uuid_add_vs(uint8_t * p_uuid, uint8_t * idx);
bool sd_service_add(ubluepy_service_obj_t * p_service_obj);
#endif // BLUETOOTH_LE_DRIVER_H__