static void btc_gattc_fill_gatt_db_conversion(uint16_t count, uint16_t num, esp_gatt_db_attr_type_t type, uint16_t offset, void *result, btgatt_db_element_t *db) { tBT_UUID bta_uuid = {0}; uint16_t db_size = (count + offset > num) ? (num - offset) : count; switch(type) { case ESP_GATT_DB_PRIMARY_SERVICE: case ESP_GATT_DB_SECONDARY_SERVICE: { esp_gattc_service_elem_t *svc_result = (esp_gattc_service_elem_t *)result; for (int i = 0; i < db_size; i++) { svc_result->is_primary = (db[offset + i].type == BTGATT_DB_PRIMARY_SERVICE) ? true : false; svc_result->start_handle = db[offset + i].start_handle; svc_result->end_handle = db[offset + i].end_handle; btc128_to_bta_uuid(&bta_uuid, db[offset + i].uuid.uu); bta_to_btc_uuid(&svc_result->uuid, &bta_uuid); svc_result++; } break; } case ESP_GATT_DB_CHARACTERISTIC: { esp_gattc_char_elem_t *char_result = (esp_gattc_char_elem_t *)result; for (int i = 0; i < db_size; i++) { char_result->char_handle = db[offset + i].attribute_handle; char_result->properties = db[offset + i].properties; btc128_to_bta_uuid(&bta_uuid, db[offset + i].uuid.uu); bta_to_btc_uuid(&char_result->uuid, &bta_uuid); char_result++; } break; } case ESP_GATT_DB_DESCRIPTOR: { esp_gattc_descr_elem_t *descr_result = (esp_gattc_descr_elem_t *)result; for (int i = 0; i < db_size; i++) { descr_result->handle = db[offset + i].attribute_handle; btc128_to_bta_uuid(&bta_uuid, db[offset + i].uuid.uu); bta_to_btc_uuid(&descr_result->uuid, &bta_uuid); descr_result++; } break; } case ESP_GATT_DB_INCLUDED_SERVICE: { esp_gattc_incl_svc_elem_t *incl_result = (esp_gattc_incl_svc_elem_t *)result; for (int i = 0; i < db_size; i++) { incl_result->handle = db[offset + i].attribute_handle; incl_result->incl_srvc_s_handle = db[offset + i].start_handle; incl_result->incl_srvc_e_handle = db[offset + i].end_handle; btc128_to_bta_uuid(&bta_uuid, db[offset + i].uuid.uu); bta_to_btc_uuid(&incl_result->uuid, &bta_uuid); incl_result++; } break; } default: BTC_TRACE_WARNING("%s(), Not support type(%d)", __func__, type); break; } }
esp_gatt_status_t btc_ble_gattc_get_db(uint16_t conn_id, uint16_t start_handle, uint16_t end_handle, esp_gattc_db_elem_t *db, uint16_t *count) { btgatt_db_element_t *get_db = NULL; int num = 0; tBT_UUID bta_uuid; uint16_t db_size = 0; BTA_GATTC_GetGattDb(conn_id, start_handle, end_handle, &get_db, &num); if (num == 0) { if (get_db) { osi_free(get_db); } *count = 0; return ESP_GATT_NOT_FOUND; } db_size = (*count > num) ? num : (*count); for (int i = 0; i < db_size; i++) { db[i].type = get_db[i].type; db[i].attribute_handle = get_db[i].id; db[i].start_handle = get_db[i].start_handle; db[i].end_handle = get_db[i].end_handle; db[i].properties = get_db[i].properties; btc128_to_bta_uuid(&bta_uuid, get_db[i].uuid.uu); bta_to_btc_uuid(&db[i].uuid, &bta_uuid); } *count = db_size; //don't forget to free the db buffer after used. if (get_db) { osi_free(get_db); } return ESP_GATT_OK; }
static void btc_to_bta_adv_data(esp_ble_adv_data_t *p_adv_data, tBTA_BLE_ADV_DATA *bta_adv_data, uint32_t *data_mask) { uint32_t mask; btc_cleanup_adv_data(bta_adv_data); memset(bta_adv_data, 0, sizeof(tBTA_BLE_ADV_DATA)); mask = 0; if (p_adv_data->flag != 0) { mask = BTM_BLE_AD_BIT_FLAGS; bta_adv_data->flag = p_adv_data->flag; } if (p_adv_data->include_name) { mask |= BTM_BLE_AD_BIT_DEV_NAME; } if (p_adv_data->include_txpower) { mask |= BTM_BLE_AD_BIT_TX_PWR; } if (p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 && p_adv_data->max_interval >= p_adv_data->min_interval) { mask |= BTM_BLE_AD_BIT_INT_RANGE; bta_adv_data->int_range.low = p_adv_data->min_interval; bta_adv_data->int_range.hi = p_adv_data->max_interval; } if (p_adv_data->include_txpower) { //TODO } if (p_adv_data->appearance != 0) { mask |= BTM_BLE_AD_BIT_APPEARANCE; bta_adv_data->appearance = p_adv_data->appearance; } if (p_adv_data->manufacturer_len > 0 && p_adv_data->p_manufacturer_data != NULL) { bta_adv_data->p_manu = osi_malloc(sizeof(tBTA_BLE_MANU)); if (bta_adv_data->p_manu != NULL) { bta_adv_data->p_manu->p_val = osi_malloc(p_adv_data->manufacturer_len); if (bta_adv_data->p_manu->p_val != NULL) { mask |= BTM_BLE_AD_BIT_MANU; bta_adv_data->p_manu->len = p_adv_data->manufacturer_len; memcpy(bta_adv_data->p_manu->p_val, p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len); } } } tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL; if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL) { p_elem_service_data = osi_malloc(sizeof(tBTA_BLE_PROP_ELEM)); if (p_elem_service_data != NULL) { p_elem_service_data->p_val = osi_malloc(p_adv_data->service_data_len); if (p_elem_service_data->p_val != NULL) { p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA; p_elem_service_data->len = p_adv_data->service_data_len; memcpy(p_elem_service_data->p_val, p_adv_data->p_service_data, p_adv_data->service_data_len); } else { osi_free(p_elem_service_data); p_elem_service_data = NULL; } } } if (NULL != p_elem_service_data) { bta_adv_data->p_proprietary = osi_malloc(sizeof(tBTA_BLE_PROPRIETARY)); if (NULL != bta_adv_data->p_proprietary) { tBTA_BLE_PROP_ELEM *p_elem = NULL; tBTA_BLE_PROPRIETARY *p_prop = bta_adv_data->p_proprietary; p_prop->num_elem = 0; mask |= BTM_BLE_AD_BIT_PROPRIETARY; p_prop->num_elem = 1; p_prop->p_elem = osi_malloc(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem); p_elem = p_prop->p_elem; if (NULL != p_elem) { memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM)); } osi_free(p_elem_service_data); } } if (p_adv_data->service_uuid_len && p_adv_data->p_service_uuid) { UINT16 *p_uuid_out16 = NULL; UINT32 *p_uuid_out32 = NULL; for (int position = 0; position < p_adv_data->service_uuid_len; position += LEN_UUID_128) { tBT_UUID bt_uuid; btc128_to_bta_uuid(&bt_uuid, p_adv_data->p_service_uuid + position); switch (bt_uuid.len) { case (LEN_UUID_16): { if (NULL == bta_adv_data->p_services) { bta_adv_data->p_services = osi_malloc(sizeof(tBTA_BLE_SERVICE)); bta_adv_data->p_services->list_cmpl = FALSE; bta_adv_data->p_services->num_service = 0; bta_adv_data->p_services->p_uuid = osi_malloc(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16); p_uuid_out16 = bta_adv_data->p_services->p_uuid; } if (NULL != bta_adv_data->p_services->p_uuid) { LOG_DEBUG("%s - In 16-UUID_data", __FUNCTION__); mask |= BTM_BLE_AD_BIT_SERVICE; ++bta_adv_data->p_services->num_service; *p_uuid_out16++ = bt_uuid.uu.uuid16; } break; } case (LEN_UUID_32): { if (NULL == bta_adv_data->p_service_32b) { bta_adv_data->p_service_32b = osi_malloc(sizeof(tBTA_BLE_32SERVICE)); bta_adv_data->p_service_32b->list_cmpl = FALSE; bta_adv_data->p_service_32b->num_service = 0; bta_adv_data->p_service_32b->p_uuid = osi_malloc(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_32); p_uuid_out32 = bta_adv_data->p_service_32b->p_uuid; } if (NULL != bta_adv_data->p_service_32b->p_uuid) { LOG_DEBUG("%s - In 32-UUID_data", __FUNCTION__); mask |= BTM_BLE_AD_BIT_SERVICE_32; ++bta_adv_data->p_service_32b->num_service; *p_uuid_out32++ = bt_uuid.uu.uuid32; } break; } case (LEN_UUID_128): { /* Currently, only one 128-bit UUID is supported */ if (NULL == bta_adv_data->p_services_128b) { bta_adv_data->p_services_128b = osi_malloc(sizeof(tBTA_BLE_128SERVICE)); if (NULL != bta_adv_data->p_services_128b) { LOG_DEBUG("%s - In 128-UUID_data", __FUNCTION__); mask |= BTM_BLE_AD_BIT_SERVICE_128; memcpy(bta_adv_data->p_services_128b->uuid128, bt_uuid.uu.uuid128, LEN_UUID_128); LOG_DEBUG("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x", bt_uuid.uu.uuid128[0], bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[4], bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[6], bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[8], bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[10], bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[12], bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[14], bt_uuid.uu.uuid128[15]); bta_adv_data->p_services_128b->list_cmpl = TRUE; } } break; } default: break; } } } *data_mask = mask; }