X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-oal%2Foal-gatt.c;h=400f6623c91187bed097610c02e2ffdac45827d5;hb=af9f4bb36d96f42cc525630077439d820908fd20;hp=000439eb7f3e362a08f4ec920788a63576d8bc54;hpb=6a5859823abb699c6ad1c3c87d4ace655648fc98;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-oal/oal-gatt.c b/bt-oal/oal-gatt.c index 000439e..400f662 100644 --- a/bt-oal/oal-gatt.c +++ b/bt-oal/oal-gatt.c @@ -213,6 +213,8 @@ static void cb_gattc_write_descriptor(int conn_id, int status, btgatt_write_para static void cb_gattc_register_for_notification(int conn_id, int registered, int status, btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id); static void cb_gattc_notify(int conn_id, btgatt_notify_params_t *p_data); +static void cb_gattc_service_changed(bt_bdaddr_t *bd_addr, int change_type, uint8_t *uuid); +static void cb_gattc_configure_mtu_cmpl(int conn_id, int status, int mtu); /*TODO GATT CLient callbacks will be implemented in subsequent patches */ static const btgatt_client_callbacks_t btgatt_client_callbacks = { @@ -227,13 +229,14 @@ static const btgatt_client_callbacks_t btgatt_client_callbacks = { .get_included_service_cb = NULL, .register_for_notification_cb = cb_gattc_register_for_notification, .notify_cb = cb_gattc_notify, + .service_changed_cb = cb_gattc_service_changed, .read_characteristic_cb = cb_gattc_read_characteristic, .write_characteristic_cb = cb_gattc_write_characteristic, .read_descriptor_cb = cb_gattc_read_descriptor, .write_descriptor_cb = cb_gattc_write_descriptor, .execute_write_cb = NULL, .read_remote_rssi_cb = NULL, - .configure_mtu_cb = NULL, + .configure_mtu_cb = cb_gattc_configure_mtu_cmpl, #ifdef PLATFORM_ANDROID_HAL .scan_filter_cfg_cb = NULL, .scan_filter_param_cb = NULL, @@ -527,6 +530,23 @@ oal_status_t gatts_multi_adv_disable(int instance_id) return OAL_STATUS_SUCCESS; } +oal_status_t gatts_set_filter_policy(int filter_policy) +{ + int ret = OAL_STATUS_SUCCESS; + + CHECK_OAL_GATT_ENABLED(); + + /* send the filter_policy value to the HAL Layer */ + ret = gatt_api->server->set_filter_policy(filter_policy); + + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("set_filter_policy failed: %d",ret); + return convert_to_oal_status(ret); + } + + return OAL_STATUS_SUCCESS; +} + oal_status_t gatts_multi_adv_update(int instance_id, int min_intv, int max_intv, int adv_type, int chnl_map, @@ -1599,6 +1619,16 @@ static void cb_gattc_notify(int conn_id, btgatt_notify_params_t *p_data) } } +static void cb_gattc_service_changed(bt_bdaddr_t *bd_addr, int change_type, uint8_t *uuid) +{ + event_gattc_service_changed_data *event = g_new0(event_gattc_service_changed_data, 1); + + memcpy(event->address.addr, bd_addr->address, 6); + event->change_type = change_type; + memcpy(event->uuid.uuid, uuid, sizeof(event->uuid.uuid)); + + send_event_bda_trace(OAL_EVENT_GATTC_SERVICE_CHANGED_IND, event, sizeof(*event), (bt_address_t *)bd_addr); +} static void cb_gattc_read_characteristic(int conn_id, int status, btgatt_read_params_t *p_data) { @@ -1741,7 +1771,6 @@ oal_status_t gattc_start_le_discovery(int client_id) BT_ERR("Error:Start LE Discovery failed: %s", status2string(ret)); return convert_to_oal_status(ret); } - send_event(OAL_EVENT_BLE_DISCOVERY_STARTED, NULL, 0); return OAL_STATUS_SUCCESS; } @@ -1757,8 +1786,7 @@ oal_status_t gattc_stop_le_discovery(int client_id) if (ret != BT_STATUS_SUCCESS) { BT_ERR("Error:Stop LE Discovery failed: %s", status2string(ret)); return convert_to_oal_status(ret); - } else - send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0); + } return OAL_STATUS_SUCCESS; } @@ -1785,6 +1813,19 @@ oal_status_t gattc_set_le_scan_param(int scan_type, int itv, int win) return OAL_STATUS_SUCCESS; } + +static void cb_gattc_configure_mtu_cmpl(int conn_id, int status, int mtu) +{ + event_gattc_mtu_configured_t *event; + BT_INFO("BTGATT Client configure mtu complete Callback, conn_id: %d, status: %d, mtu: %d", + conn_id, status, mtu); + event = g_new0(event_gattc_mtu_configured_t, 1); + event->conn_id = conn_id; + event->mtu = mtu; + event->status = convert_to_oal_status(status); + send_event(OAL_EVENT_GATTC_MTU_EXCHANGE_COMPLETED, event, sizeof(*event)); +} + /************************************ GATT Client ***********************************/ oal_status_t gattc_register(oal_uuid_t* client_uuid) { @@ -2170,3 +2211,286 @@ oal_status_t gattc_unregister_scan_filter(int slot_id) } return OAL_STATUS_SUCCESS; } + +oal_status_t gattc_enable_scan_filter(int client_if) +{ + int ret; + + API_TRACE(""); + CHECK_OAL_GATT_ENABLED(); + + BT_INFO("Enable Scan filter. Client If: %d", client_if); + + ret = gatt_api->client->scan_filter_enable(client_if, TRUE); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("error: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} + +oal_status_t gattc_disable_scan_filter(int client_if) +{ + int ret; + + API_TRACE(""); + CHECK_OAL_GATT_ENABLED(); + + BT_INFO("Disable Scan filter. Client If: %d", client_if); + + ret = gatt_api->client->scan_filter_enable(client_if, FALSE); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("error: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} + +oal_status_t gattc_register_scan_filter(oal_ble_scan_filter_t* filter_data) +{ + int ret; + int client_info = 0; + int action = 0; + int company_id = 0; + int company_id_mask = 0; + int address_type = 0; + int feature_selection = 0; + + oal_ble_scan_filter_param_setup_t scan_filter_setup = {.list_logic_type = 0, + .filt_logic_type = 1, + .rssi_high_thres = -127, + .rssi_low_thres = -127, + .dely_mode = 0, + .found_timeout = 0, + .lost_timeout = 0, + .found_timeout_cnt = 0 + }; + + OAL_CHECK_PARAMETER(filter_data, return); + API_TRACE(); + CHECK_OAL_GATT_ENABLED(); + + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS){ + bdstr_t bdstr; + BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS is being added"); + BT_INFO("BT remote Device address is %s", bdt_bd2str(filter_data->device_address, &bdstr)); + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS, + filter_data->slot_id, + company_id, + company_id_mask, + NULL, + NULL, + (bt_bdaddr_t*)filter_data->device_address, + address_type, + 0, + NULL, + 0, + NULL + ); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS; + } + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME){ + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME, + filter_data->slot_id, + company_id, + company_id_mask, + NULL, + NULL, + NULL, + address_type, + 0, + filter_data->device_name, // device_name as p_data in HAL + 0, + NULL + ); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME; + } + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID){ + BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID is being added"); + char uuid_str1[2*BT_UUID_STRING_MAX]; + char uuid_str2[2*BT_UUID_STRING_MAX]; + + uuid_to_stringname((service_uuid_t*)filter_data->service_uuid, uuid_str1); + uuid_to_stringname((service_uuid_t*)filter_data->service_uuid_mask, uuid_str2); + + BT_INFO("Service UUID is [%s] and Service UUID mask is [%s]", uuid_str1, uuid_str2); + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID, + filter_data->slot_id, + company_id, + company_id_mask, + (bt_uuid_t*)filter_data->service_uuid, + (bt_uuid_t*)filter_data->service_uuid_mask, + NULL, + address_type, + filter_data->service_uuid_len, // service_uuid_len as data_len in HAL + NULL, + filter_data->service_uuid_mask_len, + NULL + ); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID; + } + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID){ + BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID is being added"); + char uuid_str1[2*BT_UUID_STRING_MAX]; + char uuid_str2[2*BT_UUID_STRING_MAX]; + uuid_to_stringname((service_uuid_t*)filter_data->service_solicitation_uuid, uuid_str1); + uuid_to_stringname((service_uuid_t*)filter_data->service_solicitation_uuid_mask, uuid_str2); + BT_INFO("Service Solicitation UUID is [%s] and Service Solicitation UUID mask is [%s]", uuid_str1, uuid_str2); + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID, + filter_data->slot_id, + company_id, + company_id_mask, + (bt_uuid_t*)filter_data->service_solicitation_uuid, + (bt_uuid_t*)filter_data->service_solicitation_uuid_mask, + NULL, + address_type, + filter_data->service_solicitation_uuid_len, // service_solicitation_uuid_len as data_len in HAL + NULL, + filter_data->service_solicitation_uuid_mask_len, + NULL + ); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID; + } + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA){ + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA, + filter_data->slot_id, + company_id, + company_id_mask, + NULL, + NULL, + NULL, + address_type, + filter_data->service_data_len, //service_data_len as data_len in HAL + (char*)filter_data->service_data, + filter_data->service_data_mask_len, + (char*)filter_data->service_data_mask + ); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA; + } + if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA){ + ret = gatt_api->client->scan_filter_add_remove(client_info, + action, + OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA, + filter_data->slot_id, + filter_data->manufacturer_id, + company_id_mask, + NULL, + NULL, + NULL, + address_type, + filter_data->manufacturer_data_len, //manufacturer_data_len as data_len in HAL + (char*)filter_data->manufacturer_data, + filter_data->manufacturer_data_mask_len, + (char*)filter_data->manufacturer_data_mask + ); + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA; + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + BT_INFO("unregistering already set filter features."); + gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id); + return convert_to_oal_status(ret); + } + + feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA; + } + + BT_DBG("Filter selection 0x%.2x", feature_selection); + + ret = gatt_api->client->scan_filter_param_setup(client_info, action, filter_data->slot_id, feature_selection, + scan_filter_setup.list_logic_type, scan_filter_setup.filt_logic_type, + scan_filter_setup.rssi_high_thres, scan_filter_setup.rssi_low_thres, + scan_filter_setup.dely_mode, scan_filter_setup.found_timeout, + scan_filter_setup.lost_timeout, scan_filter_setup.found_timeout_cnt); + if (ret != BT_STATUS_SUCCESS){ + BT_ERR("error: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} + +oal_status_t gattc_configure_mtu(int conn_id, int mtu) +{ + int ret; + + API_TRACE("Configure MTU Size: [%d]", mtu); + CHECK_OAL_GATT_ENABLED(); + CHECK_CLIENT_CONNECTION(conn_id); + + /* To prevent crash in case other libraries not support this api */ + if (gatt_api->client->configure_mtu == NULL) { + BT_WARN("configure_mtu is NULL"); + return OAL_STATUS_NOT_SUPPORT; + } + + ret = gatt_api->client->configure_mtu(conn_id, mtu); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("Gatt client configure_mtu error: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} + +oal_status_t gattc_add_connection_info(bt_address_t *device_address, int conn_id, int server_inst_id) +{ + int ret = OAL_STATUS_SUCCESS; + bdstr_t bdstr; + + OAL_CHECK_PARAMETER(device_address, return); + API_TRACE("Add connection info: [%s]", bdt_bd2str(device_address, &bdstr)); + CHECK_OAL_GATT_ENABLED(); + CHECK_SERVER_INSTANCE(server_inst_id); + CHECK_SERVER_REGISTRATION(server_inst_id); + + ret = gatt_api->client->add_connection_info((bt_bdaddr_t *)device_address, conn_id, server_inst_id); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT connection info add failed: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} +