Skip to content
Snippets Groups Projects
Commit a7e5c836 authored by schneider's avatar schneider
Browse files

change(mp-ble): Streamline epic API

parent cf22dd80
No related branches found
No related tags found
No related merge requests found
Pipeline #5115 passed
...@@ -15,6 +15,14 @@ ...@@ -15,6 +15,14 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
/* We allow up to 10 dynamically defined services */
#define ATTS_DYN_GROUP_COUNT 10
#define ATTS_DYN_START_HANDLE 0x200
static void *dyn_groups[ATTS_DYN_GROUP_COUNT] = {};
static int next_dyn_group = 0;
static int next_handle = ATTS_DYN_START_HANDLE;
void ble_epic_att_api_event(attEvt_t *att_event) void ble_epic_att_api_event(attEvt_t *att_event)
{ {
attEvt_t *e = WsfBufAlloc(sizeof(*e)); attEvt_t *e = WsfBufAlloc(sizeof(*e));
...@@ -70,25 +78,16 @@ static uint8_t DynAttsWriteCback( ...@@ -70,25 +78,16 @@ static uint8_t DynAttsWriteCback(
return AttsSetAttr(handle, len, pValue); return AttsSetAttr(handle, len, pValue);
} }
/* We allow up to 10 dynamically defined services */
#define ATTS_DYN_GROUP_COUNT 10
#define ATTS_DYN_START_HANDLE 0x200
static int next_start_handle = ATTS_DYN_START_HANDLE;
static void *dyn_groups[ATTS_DYN_GROUP_COUNT] = {};
static int next_dyn_group = 0;
int epic_atts_dyn_create_service( int epic_atts_dyn_create_service(
const uint8_t *uuid, const uint8_t *uuid,
uint8_t uuid_len, uint8_t uuid_len,
uint16_t group_size, uint16_t group_size,
void **pSvcHandle, void **pSvcHandle
uint16_t *start_handle
) { ) {
*start_handle = next_start_handle; uint16_t start_handle = next_handle;
int end_handle = *start_handle + group_size - 1; uint16_t end_handle = start_handle + group_size - 1;
next_start_handle += group_size;
*pSvcHandle = AttsDynCreateGroup(*start_handle, end_handle); *pSvcHandle = AttsDynCreateGroup(start_handle, end_handle);
dyn_groups[next_dyn_group++] = *pSvcHandle; dyn_groups[next_dyn_group++] = *pSvcHandle;
AttsDynRegister(*pSvcHandle, NULL, DynAttsWriteCback); AttsDynRegister(*pSvcHandle, NULL, DynAttsWriteCback);
...@@ -102,6 +101,7 @@ int epic_atts_dyn_create_service( ...@@ -102,6 +101,7 @@ int epic_atts_dyn_create_service(
0, 0,
ATTS_PERMIT_READ ATTS_PERMIT_READ
); );
next_handle++;
// TODO: validate parameters and pointer and current service count // TODO: validate parameters and pointer and current service count
return 0; return 0;
...@@ -113,7 +113,7 @@ int epic_atts_dyn_add_characteristic( ...@@ -113,7 +113,7 @@ int epic_atts_dyn_add_characteristic(
uint8_t uuid_len, uint8_t uuid_len,
uint8_t flags, uint8_t flags,
uint16_t maxLen, uint16_t maxLen,
uint16_t current_handle uint16_t *value_handle
) { ) {
uint8_t settings = ATTS_SET_VARIABLE_LEN; uint8_t settings = ATTS_SET_VARIABLE_LEN;
if (flags & ATT_PROP_WRITE) { if (flags & ATT_PROP_WRITE) {
...@@ -129,7 +129,7 @@ int epic_atts_dyn_add_characteristic( ...@@ -129,7 +129,7 @@ int epic_atts_dyn_add_characteristic(
} }
uint8_t characteristic[1 + 2 + 16] = { uint8_t characteristic[1 + 2 + 16] = {
flags, UINT16_TO_BYTES(current_handle + 1) flags, UINT16_TO_BYTES(next_handle + 1)
}; };
memcpy(characteristic + 3, uuid, uuid_len); memcpy(characteristic + 3, uuid, uuid_len);
uint8_t characteristic_len = 1 + 2 + uuid_len; uint8_t characteristic_len = 1 + 2 + uuid_len;
...@@ -144,8 +144,10 @@ int epic_atts_dyn_add_characteristic( ...@@ -144,8 +144,10 @@ int epic_atts_dyn_add_characteristic(
0, 0,
ATTS_PERMIT_READ ATTS_PERMIT_READ
); );
next_handle++;
/* Value */ /* Value */
*value_handle = next_handle;
if ((flags & ATT_PROP_READ) == 0) { if ((flags & ATT_PROP_READ) == 0) {
AttsDynAddAttrDynConst( AttsDynAddAttrDynConst(
pSvcHandle, pSvcHandle,
...@@ -169,6 +171,7 @@ int epic_atts_dyn_add_characteristic( ...@@ -169,6 +171,7 @@ int epic_atts_dyn_add_characteristic(
permissions permissions
); );
} }
next_handle++;
return 0; return 0;
} }
...@@ -179,7 +182,8 @@ int epic_ble_atts_dyn_add_descriptor( ...@@ -179,7 +182,8 @@ int epic_ble_atts_dyn_add_descriptor(
uint8_t flags, uint8_t flags,
const uint8_t *value, const uint8_t *value,
uint16_t value_len, uint16_t value_len,
uint16_t maxLen uint16_t maxLen,
uint16_t *descriptor_handle
) { ) {
uint8_t settings = 0; uint8_t settings = 0;
if (flags & ATT_PROP_WRITE) { if (flags & ATT_PROP_WRITE) {
...@@ -194,6 +198,7 @@ int epic_ble_atts_dyn_add_descriptor( ...@@ -194,6 +198,7 @@ int epic_ble_atts_dyn_add_descriptor(
permissions |= ATTS_PERMIT_WRITE; permissions |= ATTS_PERMIT_WRITE;
} }
*descriptor_handle = next_handle;
AttsDynAddAttrDyn( AttsDynAddAttrDyn(
pSvcHandle, pSvcHandle,
uuid, uuid,
...@@ -204,6 +209,7 @@ int epic_ble_atts_dyn_add_descriptor( ...@@ -204,6 +209,7 @@ int epic_ble_atts_dyn_add_descriptor(
settings, settings,
permissions permissions
); );
next_handle++;
return 0; return 0;
} }
...@@ -228,7 +234,7 @@ int epic_ble_atts_dyn_delete_groups(void) ...@@ -228,7 +234,7 @@ int epic_ble_atts_dyn_delete_groups(void)
} }
} }
next_dyn_group = 0; next_dyn_group = 0;
next_start_handle = ATTS_DYN_START_HANDLE; next_handle = ATTS_DYN_START_HANDLE;
return 0; return 0;
} }
......
...@@ -2640,12 +2640,12 @@ API(API_BLE_HID_SEND_REPORT, int epic_ble_hid_send_report(uint8_t report_id, uin ...@@ -2640,12 +2640,12 @@ API(API_BLE_HID_SEND_REPORT, int epic_ble_hid_send_report(uint8_t report_id, uin
* *
* The MicroPython Bluetooth module is still in flux so this API will continue to change as well. * The MicroPython Bluetooth module is still in flux so this API will continue to change as well.
*/ */
API(API_BLE_ATTS_DYN_CREATE_GROUP, int epic_atts_dyn_create_service(const uint8_t *uuid, uint8_t uuid_len, uint16_t group_size, void **pSvcHandle, uint16_t *start_handle)); API(API_BLE_ATTS_DYN_CREATE_GROUP, int epic_atts_dyn_create_service(const uint8_t *uuid, uint8_t uuid_len, uint16_t group_size, void **pSvcHandle));
//API(API_BLE_ATTS_DYN_DELETE_GROUP, void AttsDynDeleteGroup(void *pSvcHandle)); //API(API_BLE_ATTS_DYN_DELETE_GROUP, void AttsDynDeleteGroup(void *pSvcHandle));
API(API_BLE_ATTS_DYN_DELETE_GROUPS, int epic_ble_atts_dyn_delete_groups(void)); API(API_BLE_ATTS_DYN_DELETE_GROUPS, int epic_ble_atts_dyn_delete_groups(void));
API(API_BLE_ATTS_DYN_ADD_DESCRIPTOR, int epic_ble_atts_dyn_add_descriptor(void *pSvcHandle, const uint8_t *uuid, uint8_t uuid_len, uint8_t flags, const uint8_t *value, uint16_t value_len, uint16_t maxLen)); API(API_BLE_ATTS_DYN_ADD_CHARACTERISTIC, int epic_atts_dyn_add_characteristic(void *pSvcHandle, const uint8_t *uuid, uint8_t uuid_len, uint8_t flags, uint16_t maxLen, uint16_t *value_handle));
API(API_BLE_ATTS_DYN_ADD_CHARACTERISTIC, int epic_atts_dyn_add_characteristic(void *pSvcHandle, const uint8_t *uuid, uint8_t uuid_len, uint8_t flags, uint16_t maxLen, uint16_t current_handle)); API(API_BLE_ATTS_DYN_ADD_DESCRIPTOR, int epic_ble_atts_dyn_add_descriptor(void *pSvcHandle, const uint8_t *uuid, uint8_t uuid_len, uint8_t flags, const uint8_t *value, uint16_t value_len, uint16_t maxLen, uint16_t *descriptor_handle));
API(API_BLE_ATTS_SEND_SERVICE_CHANGED_IND, int epic_atts_dyn_send_service_changed_ind(void)); API(API_BLE_ATTS_SEND_SERVICE_CHANGED_IND, int epic_atts_dyn_send_service_changed_ind(void));
......
...@@ -395,21 +395,14 @@ int mp_bluetooth_gatts_register_service( ...@@ -395,21 +395,14 @@ int mp_bluetooth_gatts_register_service(
const uint16_t numHandles = const uint16_t numHandles =
1 + num_characteristics * 2 + num_ccds + num_descriptors_total; 1 + num_characteristics * 2 + num_ccds + num_descriptors_total;
uint16_t startHandle;
uint8_t uuid_len = uint8_t uuid_len =
service_uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 : 16; service_uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 : 16;
// TODO: handle error // TODO: handle error
epic_atts_dyn_create_service( epic_atts_dyn_create_service(
service_uuid->data, service_uuid->data, uuid_len, numHandles, &pSvcHandle
uuid_len,
numHandles,
&pSvcHandle,
&startHandle
); );
uint16_t currentHandle = startHandle;
size_t descriptor_index = 0; size_t descriptor_index = 0;
size_t handle_index = 0; size_t handle_index = 0;
...@@ -418,28 +411,26 @@ int mp_bluetooth_gatts_register_service( ...@@ -418,28 +411,26 @@ int mp_bluetooth_gatts_register_service(
mp_obj_bluetooth_uuid_t *uuid = characteristic_uuids[i]; mp_obj_bluetooth_uuid_t *uuid = characteristic_uuids[i];
uuid_len = uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 : 16; uuid_len = uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 : 16;
currentHandle++; uint16_t value_handle;
epic_atts_dyn_add_characteristic( epic_atts_dyn_add_characteristic(
pSvcHandle, pSvcHandle,
uuid->data, uuid->data,
uuid_len, uuid_len,
flags, flags,
MP_BLUETOOTH_DEFAULT_ATTR_LEN, MP_BLUETOOTH_DEFAULT_ATTR_LEN,
currentHandle &value_handle
); );
currentHandle++;
; ;
handles[handle_index] = currentHandle; handles[handle_index] = value_handle;
mp_bluetooth_gatts_db_create_entry( mp_bluetooth_gatts_db_create_entry(
GATTS_DB, currentHandle, MP_BLUETOOTH_DEFAULT_ATTR_LEN GATTS_DB, value_handle, MP_BLUETOOTH_DEFAULT_ATTR_LEN
); );
gatts_status_create_entry(GATTS_STATUS, currentHandle); gatts_status_create_entry(GATTS_STATUS, value_handle);
if ((flags & MP_BLUETOOTH_CHARACTERISTIC_FLAG_NOTIFY) || if ((flags & MP_BLUETOOTH_CHARACTERISTIC_FLAG_NOTIFY) ||
flags & (MP_BLUETOOTH_CHARACTERISTIC_FLAG_INDICATE)) { flags & (MP_BLUETOOTH_CHARACTERISTIC_FLAG_INDICATE)) {
/* CCCD */ /* CCCD */
currentHandle++;
uint8_t cccd_buf[2] = {}; uint8_t cccd_buf[2] = {};
// TODO: Handle CCC data. // TODO: Handle CCC data.
// Until then: activate notification/indications by default. // Until then: activate notification/indications by default.
...@@ -450,6 +441,7 @@ int mp_bluetooth_gatts_register_service( ...@@ -450,6 +441,7 @@ int mp_bluetooth_gatts_register_service(
cccd_buf[0] |= 0x02; cccd_buf[0] |= 0x02;
} }
uint16_t cccd_handle;
uint8_t ccc_uuid[] = { 0x02, 0x29 }; uint8_t ccc_uuid[] = { 0x02, 0x29 };
uint8_t flags = MP_BLUETOOTH_CHARACTERISTIC_FLAG_READ | uint8_t flags = MP_BLUETOOTH_CHARACTERISTIC_FLAG_READ |
MP_BLUETOOTH_CHARACTERISTIC_FLAG_WRITE; MP_BLUETOOTH_CHARACTERISTIC_FLAG_WRITE;
...@@ -460,17 +452,16 @@ int mp_bluetooth_gatts_register_service( ...@@ -460,17 +452,16 @@ int mp_bluetooth_gatts_register_service(
flags, flags,
cccd_buf, cccd_buf,
sizeof(cccd_buf), sizeof(cccd_buf),
sizeof(cccd_buf) sizeof(cccd_buf),
); &cccd_handle
epic_ble_atts_set_attr(
currentHandle, cccd_buf, sizeof(cccd_buf)
); );
mp_bluetooth_gatts_db_create_entry( mp_bluetooth_gatts_db_create_entry(
GATTS_DB, currentHandle, sizeof(cccd_buf) GATTS_DB, cccd_handle, sizeof(cccd_buf)
); );
int ret = mp_bluetooth_gatts_db_write( int ret = mp_bluetooth_gatts_db_write(
GATTS_DB, GATTS_DB,
currentHandle, cccd_handle,
cccd_buf, cccd_buf,
sizeof(cccd_buf) sizeof(cccd_buf)
); );
...@@ -488,6 +479,7 @@ int mp_bluetooth_gatts_register_service( ...@@ -488,6 +479,7 @@ int mp_bluetooth_gatts_register_service(
uuid_len = uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 : uuid_len = uuid->type == MP_BLUETOOTH_UUID_TYPE_16 ? 2 :
16; 16;
uint16_t descriptor_handle;
epic_ble_atts_dyn_add_descriptor( epic_ble_atts_dyn_add_descriptor(
pSvcHandle, pSvcHandle,
uuid->data, uuid->data,
...@@ -495,12 +487,14 @@ int mp_bluetooth_gatts_register_service( ...@@ -495,12 +487,14 @@ int mp_bluetooth_gatts_register_service(
flags, flags,
NULL, NULL,
0, 0,
MP_BLUETOOTH_DEFAULT_ATTR_LEN MP_BLUETOOTH_DEFAULT_ATTR_LEN,
&descriptor_handle
); );
handles[handle_index] = descriptor_handle;
mp_bluetooth_gatts_db_create_entry( mp_bluetooth_gatts_db_create_entry(
GATTS_DB, GATTS_DB,
handles[handle_index], descriptor_handle,
MP_BLUETOOTH_DEFAULT_ATTR_LEN MP_BLUETOOTH_DEFAULT_ATTR_LEN
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment