X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-api%2Fbt-adapter-le.c;h=45fab9cbb3d6cc1a21ad9c2e8a80bd0dc566797d;hb=1fa07edcd0e77a445700975773db3300f556caf5;hp=a00c1ad3a6345c83f196ab1bf8aea4a424103850;hpb=f8cd843634b70ab96c83bd552606c197fcf5decc;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-api/bt-adapter-le.c b/bt-api/bt-adapter-le.c old mode 100755 new mode 100644 index a00c1ad..45fab9c --- a/bt-api/bt-adapter-le.c +++ b/bt-api/bt-adapter-le.c @@ -1,11 +1,5 @@ /* - * Bluetooth-frwk - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hocheol Seo - * Girishashok Joshi - * Chanyeol Park + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,18 +25,19 @@ #include "bt-request-sender.h" #include "bt-event-handler.h" +static gboolean is_le_scanning = FALSE; +static int is_scan_filter_supported = -1; + BT_EXPORT_API int bluetooth_check_adapter_le(void) { int ret; - int value = 1; + int value; - ret = _bt_get_adapter_path(_bt_gdbus_get_system_gconn(), NULL); + ret = _bt_get_adapter_path(_bt_get_system_private_conn(), NULL); - if (ret != BLUETOOTH_ERROR_NONE) { + if (ret != BLUETOOTH_ERROR_NONE) return BLUETOOTH_ADAPTER_LE_DISABLED; - } -#ifdef ENABLE_TIZEN_2_4 ret = vconf_get_int(VCONFKEY_BT_LE_STATUS, &value); if (ret != 0) { BT_ERR("fail to get vconf key!"); @@ -52,18 +47,12 @@ BT_EXPORT_API int bluetooth_check_adapter_le(void) BT_DBG("value : %d", value); return value == VCONFKEY_BT_LE_STATUS_ON ? BLUETOOTH_ADAPTER_LE_ENABLED : BLUETOOTH_ADAPTER_LE_DISABLED; -#else - return value = BLUETOOTH_ADAPTER_LE_DISABLED; -#endif } BT_EXPORT_API int bluetooth_enable_adapter_le(void) { int result; - retv_if(bluetooth_check_adapter_le() == BLUETOOTH_ADAPTER_LE_ENABLED, - BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED); - BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); @@ -91,6 +80,17 @@ BT_EXPORT_API int bluetooth_disable_adapter_le(void) return result; } +void _bt_set_le_scan_status(gboolean mode) +{ + BT_DBG("set LE scan mode : %d -> %d", is_le_scanning, mode); + is_le_scanning = mode; +} + +BT_EXPORT_API gboolean bluetooth_is_le_scanning(void) +{ + return is_le_scanning; +} + BT_EXPORT_API int bluetooth_start_le_discovery(void) { int result; @@ -100,11 +100,16 @@ BT_EXPORT_API int bluetooth_start_le_discovery(void) BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + BT_INFO_C("### Start LE scan"); + _bt_print_api_caller_name(); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_START_LE_DISCOVERY, in_param1, in_param2, in_param3, in_param4, &out_param); BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + if (result == BLUETOOTH_ERROR_NONE) + _bt_set_le_scan_status(TRUE); + return result; } @@ -117,12 +122,15 @@ BT_EXPORT_API int bluetooth_stop_le_discovery(void) BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + BT_INFO_C("### Stop LE scan"); + _bt_print_api_caller_name(); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_STOP_LE_DISCOVERY, in_param1, in_param2, in_param3, in_param4, &out_param); - BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + _bt_set_le_scan_status(FALSE); + return result; } @@ -151,10 +159,94 @@ BT_EXPORT_API int bluetooth_is_le_discovering(void) return is_discovering; } -#ifdef TIZEN_WEARABLE +BT_EXPORT_API gboolean bluetooth_is_scan_filter_supported(void) +{ + int result; + + if (is_scan_filter_supported == -1) { + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_SCAN_FILTER_SUPPORTED, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) + is_scan_filter_supported = g_array_index(out_param, int, 0); + else + BT_ERR("Fail to send request"); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + } + + if (is_scan_filter_supported == 1) + return TRUE; + + return FALSE; +} + +BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id) +{ + int result; + + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_array_append_vals(in_param1, filter, sizeof(bluetooth_le_scan_filter_t)); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) + *slot_id = g_array_index(out_param, int, 0); + else + BT_ERR("Fail to send request"); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id) +{ + int result; + + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_array_append_vals(in_param1, &slot_id, sizeof(int)); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER, + in_param1, in_param2, in_param3, in_param4, &out_param); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_unregister_all_scan_filters(void) +{ + int result; + + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS, + in_param1, in_param2, in_param3, in_param4, &out_param); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + gboolean __bluetooth_is_privileged_process(void) { - FILE *fp= NULL; + FILE *fp = NULL; char path[30] = {0, }; char buf[256] = {0, }; @@ -173,24 +265,25 @@ gboolean __bluetooth_is_privileged_process(void) fclose(fp); return FALSE; } -#endif -BT_EXPORT_API int bluetooth_set_advertising(gboolean enable) +BT_EXPORT_API int bluetooth_set_advertising(int handle, gboolean enable) { int result; - gboolean use_reserved_slot = FALSE; + gboolean use_reserved_slot = TRUE; BT_CHECK_ENABLED_ANY(return); -#ifdef TIZEN_WEARABLE - use_reserved_slot = __bluetooth_is_privileged_process(); -#endif + if (TIZEN_PROFILE_WEARABLE) + use_reserved_slot = __bluetooth_is_privileged_process(); + + _bt_print_api_caller_name(); BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); - g_array_append_vals(in_param1, &enable, sizeof(gboolean)); - g_array_append_vals(in_param2, &use_reserved_slot, sizeof(gboolean)); + g_array_append_vals(in_param1, &handle, sizeof(int)); + g_array_append_vals(in_param2, &enable, sizeof(gboolean)); + g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean)); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING, in_param1, in_param2, in_param3, in_param4, &out_param); @@ -200,24 +293,26 @@ BT_EXPORT_API int bluetooth_set_advertising(gboolean enable) return result; } -BT_EXPORT_API int bluetooth_set_custom_advertising(gboolean enable, +BT_EXPORT_API int bluetooth_set_custom_advertising(int handle, gboolean enable, bluetooth_advertising_params_t *params) { int result; - gboolean use_reserved_slot = FALSE; + gboolean use_reserved_slot = TRUE; BT_CHECK_ENABLED_ANY(return); -#ifdef TIZEN_WEARABLE + if (TIZEN_PROFILE_WEARABLE) use_reserved_slot = __bluetooth_is_privileged_process(); -#endif + + _bt_print_api_caller_name(); BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); - g_array_append_vals(in_param1, &enable, sizeof(gboolean)); - g_array_append_vals(in_param2, params, sizeof(bluetooth_advertising_params_t)); - g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean)); + g_array_append_vals(in_param1, &handle, sizeof(int)); + g_array_append_vals(in_param2, &enable, sizeof(gboolean)); + g_array_append_vals(in_param3, params, sizeof(bluetooth_advertising_params_t)); + g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean)); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_CUSTOM_ADVERTISING, in_param1, in_param2, in_param3, in_param4, &out_param); @@ -255,10 +350,10 @@ BT_EXPORT_API int bluetooth_get_advertising_data(bluetooth_advertising_data_t *a return result; } -BT_EXPORT_API int bluetooth_set_advertising_data(const bluetooth_advertising_data_t *value, int length) +BT_EXPORT_API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length) { int result; - gboolean use_reserved_slot = FALSE; + gboolean use_reserved_slot = TRUE; BT_CHECK_PARAMETER(value, return); BT_CHECK_ENABLED_ANY(return); @@ -266,16 +361,16 @@ BT_EXPORT_API int bluetooth_set_advertising_data(const bluetooth_advertising_dat if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 3) return BLUETOOTH_ERROR_INVALID_PARAM; -#ifdef TIZEN_WEARABLE - use_reserved_slot = __bluetooth_is_privileged_process(); -#endif + if (TIZEN_PROFILE_WEARABLE) + use_reserved_slot = __bluetooth_is_privileged_process(); BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); - g_array_append_vals(in_param1, value, sizeof(bluetooth_advertising_data_t)); - g_array_append_vals(in_param2, &length, sizeof(int)); - g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean)); + g_array_append_vals(in_param1, &handle, sizeof(int)); + g_array_append_vals(in_param2, value, sizeof(bluetooth_advertising_data_t)); + g_array_append_vals(in_param3, &length, sizeof(int)); + g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean)); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_ADVERTISING_DATA, in_param1, in_param2, in_param3, in_param4, &out_param); @@ -313,11 +408,11 @@ BT_EXPORT_API int bluetooth_get_scan_response_data(bluetooth_scan_resp_data_t *v return result; } -BT_EXPORT_API int bluetooth_set_scan_response_data( +BT_EXPORT_API int bluetooth_set_scan_response_data(int handle, const bluetooth_scan_resp_data_t *value, int length) { int result; - gboolean use_reserved_slot = FALSE; + gboolean use_reserved_slot = TRUE; BT_CHECK_PARAMETER(value, return); BT_CHECK_ENABLED_ANY(return); @@ -325,16 +420,16 @@ BT_EXPORT_API int bluetooth_set_scan_response_data( if (length > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX) return BLUETOOTH_ERROR_INVALID_PARAM; -#ifdef TIZEN_WEARABLE - use_reserved_slot = __bluetooth_is_privileged_process(); -#endif + if (TIZEN_PROFILE_WEARABLE) + use_reserved_slot = __bluetooth_is_privileged_process(); BT_INIT_PARAMS(); BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); - g_array_append_vals(in_param1, value, length); - g_array_append_vals(in_param2, &length, sizeof(int)); - g_array_append_vals(in_param3, &use_reserved_slot, sizeof(gboolean)); + g_array_append_vals(in_param1, &handle, sizeof(int)); + g_array_append_vals(in_param2, value, length); + g_array_append_vals(in_param3, &length, sizeof(int)); + g_array_append_vals(in_param4, &use_reserved_slot, sizeof(gboolean)); result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCAN_RESPONSE_DATA, in_param1, in_param2, in_param3, in_param4, &out_param); @@ -375,11 +470,10 @@ BT_EXPORT_API int bluetooth_is_advertising(gboolean *is_advertising) result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_ADVERTISING, in_param1, in_param2, in_param3, in_param4, &out_param); - if (result == BLUETOOTH_ERROR_NONE) { + if (result == BLUETOOTH_ERROR_NONE) *is_advertising = g_array_index(out_param, int, 0); - } else { + else BT_ERR("Fail to send request"); - } BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); @@ -464,6 +558,36 @@ BT_EXPORT_API int bluetooth_enable_le_privacy(gboolean enable_privacy) return result; } +BT_EXPORT_API int bluetooth_set_le_static_random_address(gboolean enable) +{ + int result; + + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_array_append_vals(in_param1, &enable, sizeof(gboolean)); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_LE_STATIC_RANDOM_ADDRESS, + in_param1, in_param2, in_param3, in_param4, &out_param); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_check_privilege_advertising_parameter(void) +{ + if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_SET_ADVERTISING_PARAMETERS) + == BLUETOOTH_ERROR_PERMISSION_DEINED) { + BT_ERR("Don't have a privilege to use this API"); + return BLUETOOTH_ERROR_PERMISSION_DEINED; + } + + return BLUETOOTH_ERROR_NONE; +} + BT_EXPORT_API int bluetooth_le_register_callback(bluetooth_cb_func_ptr callback_ptr, void *user_data) { int ret; @@ -483,4 +607,160 @@ BT_EXPORT_API int bluetooth_le_unregister_callback(void) _bt_unregister_event(BT_LE_ADAPTER_EVENT); return BLUETOOTH_ERROR_NONE; -} \ No newline at end of file +} + +BT_EXPORT_API int bluetooth_le_read_maximum_data_length( + bluetooth_le_read_maximum_data_length_t *max_le_datalength) +{ + BT_CHECK_ENABLED_ANY(return); + BT_INIT_PARAMS(); + int result; + bluetooth_le_read_maximum_data_length_t *datalength = NULL; + + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, + BT_LE_READ_MAXIMUM_DATA_LENGTH, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) { + datalength = &g_array_index(out_param, + bluetooth_le_read_maximum_data_length_t, 0); + max_le_datalength->max_tx_octets = datalength->max_tx_octets; + max_le_datalength->max_tx_time = datalength->max_tx_time; + max_le_datalength->max_rx_octets = datalength->max_rx_octets; + max_le_datalength->max_rx_time = datalength->max_rx_time; + } + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_le_write_host_suggested_default_data_length( + const unsigned int def_tx_Octets, const unsigned int def_tx_Time) +{ + BT_CHECK_ENABLED_ANY(return); + BT_INIT_PARAMS(); + + int result; + + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_array_append_vals(in_param1, &def_tx_Octets, sizeof(guint)); + g_array_append_vals(in_param2, &def_tx_Time, sizeof(guint)); + + result = _bt_send_request(BT_BLUEZ_SERVICE, + BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result != BLUETOOTH_ERROR_NONE) + BT_ERR("Failed to Write the host suggested default data length values : %d", result); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_le_read_suggested_default_data_length( + bluetooth_le_read_host_suggested_data_length_t *le_data_length) +{ + BT_CHECK_ENABLED_ANY(return); + BT_INIT_PARAMS(); + + int result; + bluetooth_le_read_host_suggested_data_length_t *data_values = NULL; + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, + BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) { + data_values = &g_array_index(out_param, + bluetooth_le_read_host_suggested_data_length_t, 0); + + le_data_length->def_tx_octets = data_values->def_tx_octets; + le_data_length->def_tx_time = data_values->def_tx_time; + } + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_le_set_data_length(bluetooth_device_address_t *address, + const unsigned int max_tx_octets, const unsigned int max_tx_time) +{ + BT_CHECK_ENABLED_ANY(return); + BT_INIT_PARAMS(); + + int result; + + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_array_append_vals(in_param1, address, sizeof(bluetooth_device_address_t)); + g_array_append_vals(in_param2, &max_tx_octets, sizeof(guint)); + g_array_append_vals(in_param3, &max_tx_time, sizeof(guint)); + + result = _bt_send_request(BT_BLUEZ_SERVICE, + BT_LE_SET_DATA_LENGTH, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result != BLUETOOTH_ERROR_NONE) + BT_ERR("Failed to Set data length values : %d", result); + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + return result; +} + +BT_EXPORT_API int bluetooth_is_le_2m_phy_supported(gboolean *is_supported) +{ + int result; + + BT_CHECK_PARAMETER(is_supported, return); + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_2M_PHY_SUPPORTED, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) { + *is_supported = g_array_index(out_param, int, 0); + } else { + BT_ERR("Fail to send request"); + } + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + BT_INFO("LE 2M PHY Support[%s]", *is_supported ? "TRUE" : "FALSE"); + return result; +} + +BT_EXPORT_API int bluetooth_is_le_coded_phy_supported(gboolean *is_supported) +{ + int result; + + BT_CHECK_PARAMETER(is_supported, return); + BT_CHECK_ENABLED_ANY(return); + + BT_INIT_PARAMS(); + BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + result = _bt_send_request(BT_BLUEZ_SERVICE, BT_IS_LE_CODED_PHY_SUPPORTED, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (result == BLUETOOTH_ERROR_NONE) { + *is_supported = g_array_index(out_param, int, 0); + } else { + BT_ERR("Fail to send request"); + } + + BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + BT_INFO("LE CODED PHY Support[%s]", *is_supported ? "TRUE" : "FALSE"); + return result; +}