_bt_headset_event_cb(BLUETOOTH_EVENT_AUDIO_AVC_STATUS,
result, &mode,
event_info->cb, event_info->user_data);
+ } else if (strcasecmp(signal_name, BT_MEDIA_VOLUME_CHANGE) == 0) {
+ unsigned int volume;
+
+ g_variant_get(parameters, "(u)", &volume);
+ _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
+ result, &volume,
+ event_info->cb, event_info->user_data);
}
#endif
}
_bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_DELAY_CHANGED,
result, &delay,
event_info->cb, event_info->user_data);
- } else if (strcasecmp(signal_name, BT_MEDIA_VOLUME_CHANGE) == 0) {
- unsigned int volume;
-
- g_variant_get(parameters, "(u)", &volume);
- _bt_avrcp_event_cb(BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
- result, &volume,
- event_info->cb, event_info->user_data);
}
}
return ret;
}
+ g_free(adapter_path);
+
if (powered)
*state = 1;
else
#define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
#define BT_AUDIO_SOURCE_MAX 2
-static char *avrcp_control_path = NULL;
-static char *avrcp_transport_path = NULL;
-
static GDBusConnection *system_conn;
static GDBusConnection *session_conn;
static GDBusProxy *manager_gproxy = NULL;
char *control_path;
char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
- if (avrcp_control_path != NULL)
- return avrcp_control_path;
+ /* We can add the cache to get transport path for each device */
_bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
if (control_path == NULL)
return NULL;
- avrcp_control_path = control_path;
DBG("control_path = %s", control_path);
return control_path;
}
char *transport_path;
char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
- if (avrcp_transport_path != NULL)
- return avrcp_transport_path;
+ /* We can add the cache to get transport path for each device */
_bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
if (transport_path == NULL)
return NULL;
- avrcp_transport_path = transport_path;
DBG("transport_path = %s", transport_path);
return transport_path;
}
(BT_HAL_STACK_UUID_SIZE * uuid_count),
uuids);
ev->num_props = num_props_tmp + 1;
- g_free(uuid_value);
+ g_strfreev(uuid_value);
}
g_variant_unref(tmp_value);
uint8_t addr_type;
uint8_t adv_type;
int rssi;
- int data_len;
- uint8_t data[BT_HAL_ADV_DATA_MAX_SIZE * 2];
+ uint8_t adv_data[BT_HAL_ADV_DATA_MAX_SIZE];
+ int adv_data_len;
+ uint8_t scan_rsp_data[BT_HAL_ADV_DATA_MAX_SIZE];
+ int scan_rsp_data_len;
guint timer_id;
} bt_hal_le_adv_info_t;
str2bt_bdaddr_t(adv_info->addr, &bd_addr);
if (bt_gatt_callbacks->client->scan_result_cb)
bt_gatt_callbacks->client->scan_result_cb(
- &bd_addr, adv_info->rssi, adv_info->data);
+ &bd_addr, adv_info->addr_type, adv_info->rssi,
+ adv_info->adv_data, adv_info->adv_data_len,
+ adv_info->scan_rsp_data, adv_info->scan_rsp_data_len);
}
static void __bt_handle_gatt_client_connected(void *buf, uint16_t len)
adv_info = __bt_hal_get_adv_ind_info(address);
if (adv_info) {
/* Copy scan response data in data field and send event */
- memcpy(&(adv_info->data[adv_info->data_len]), ev->adv_data, data_len);
+ adv_info->scan_rsp_data_len = data_len;
+ memcpy(adv_info->scan_rsp_data, ev->adv_data, data_len);
__bt_hal_send_le_scan_result_event(adv_info);
adv_ind_list = g_slist_remove(adv_ind_list, adv_info);
if (adv_info->timer_id)
adv_info->addr_type = ev->addr_type;
adv_info->adv_type = ev->adv_type;
adv_info->rssi = ev->rssi;
- adv_info->data_len = data_len;
- memcpy(adv_info->data, ev->adv_data, data_len);
+ adv_info->adv_data_len = data_len;
+ memcpy(adv_info->adv_data, ev->adv_data, data_len);
#ifdef TIZEN_BT_HAL
if (_bt_hal_gatt_client_get_le_scan_type() == BT_GATTC_LE_SCAN_TYPE_PASSIVE) {
bt_uuid_t *app_uuid);
/** Callback for scan results */
-typedef void (*scan_result_callback)(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data);
+typedef void (*scan_result_callback)(bt_bdaddr_t* bda, uint8_t addr_type, int rssi,
+ uint8_t* adv_data, int adv_dat_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
/** GATT open callback invoked in response to open */
typedef void (*connect_callback)(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
/* BLE: Scan Result Callback data */
typedef struct {
int rssi;
+ uint8_t addr_type;
bt_address_t address;
uint8_t adv_data[BLE_ADV_DATA_LENGTH];
+ int adv_data_len;
+ uint8_t scan_rsp_data[BLE_ADV_DATA_LENGTH];
+ int scan_rsp_data_len;
} event_ble_scan_result_info;
typedef struct {
#define OAL_UUID_MAX_LENGTH 16/**< This specifies ble service UUID Length */
-#define BLE_ADV_DATA_LENGTH 62 /**< This specifies Advertising Data Length */
+#define BLE_ADV_DATA_LENGTH 31 /**< This specifies Advertising Data Length */
#define BT_ADDRESS_STR_LEN 18 /**< BT address String length> */
/* Forward declaration for GATT client callbacks */
static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid);
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data);
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi,
+ uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
static void cb_gattc_connection(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
static void cb_gattc_disconnect(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id);
send_event(OAL_EVENT_GATTC_REGISTRATION, event, sizeof(event_gattc_register_t));
}
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data)
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi,
+ uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len)
{
event_ble_scan_result_info *event;
event = g_new0(event_ble_scan_result_info, 1);
+ event->addr_type = addr_type;
event->rssi = rssi;
memcpy(event->address.addr, bdaddress->address, BT_ADDRESS_BYTES_NUM);
memcpy(event->adv_data, adv_data, BLE_ADV_DATA_LENGTH);
+ event->adv_data_len = adv_data_len;
+ memcpy(event->scan_rsp_data, scan_rsp_data, BLE_ADV_DATA_LENGTH);
+ event->scan_rsp_data_len = scan_rsp_data_len;
send_event_bda_trace(OAL_EVENT_BLE_REMOTE_DEVICE_FOUND, event,
sizeof(event_ble_scan_result_info), (bt_address_t *)bdaddress);
}
static const hw_module_t* module = NULL;
static const bt_interface_t *blued_api = NULL;
+static bluetooth_device_t* bt_device = NULL;
static gboolean unload_libs(gpointer data);
static bluetooth_device_t* load_hal_lib(void);
oal_status_t oal_mgr_init_internal(void)
{
- bluetooth_device_t* bt_device;
-
bt_device = load_hal_lib();
if (bt_device == NULL) {
static gboolean unload_libs(gpointer data)
{
+ bt_device->common.close((hw_device_t*)bt_device);
unload((hw_module_t const*)module);
module = NULL;
return FALSE;
{
int err = 0;
hw_device_t* device;
- bluetooth_device_t* bt_device = NULL;
BT_DBG("Loading HAL lib");
if (module == NULL) {
}
}
-static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
-{
- int length = 0;
- int i = 0;
-
- while (i <= 31) {
- int len = src[i];
-
- if ((len == 0) || (31 < (i + len))) {
- memcpy(dest, src, length);
- break;
- }
-
- length += (len + 1);
- i += (len + 1);
- }
-
- return length;
-}
-
static int __bt_get_ad_data_by_type(const char *in_data, int in_len,
char in_type, char **data, int *data_len)
{
int result = BLUETOOTH_ERROR_NONE;
bt_adapter_le_scanner_t *scanner = NULL;
char address[BT_ADDRESS_STRING_SIZE];
- int addr_type = 0x01; /* TODO: Need to get correct address type */
unsigned char adv_ind_data[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX];
unsigned char scan_resp_data[BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX];
int adv_ind_len = 0;
_bt_convert_addr_type_to_string(address, scan_result->address.addr);
memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
- adv_ind_len = __get_advertisement_data(
- adv_ind_data, &(scan_result->adv_data[0]));
- if (adv_ind_len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX) {
- BT_ERR("Invalid advertising data");
- return;
- }
+ adv_ind_len = scan_result->adv_data_len;
+ memcpy(adv_ind_data, scan_result->adv_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
- scan_resp_len = __get_advertisement_data(
- scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
- if (scan_resp_len > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX) {
- BT_ERR("Invalid scan response data");
- return;
- }
+ scan_resp_len = scan_result->scan_rsp_data_len;
+ memcpy(scan_resp_data, scan_result->scan_rsp_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
BT_DBG("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
address, scan_result->rssi, adv_ind_len, scan_resp_len);
param = g_variant_new("(isnnn@ayn@ay)",
result, address,
- addr_type, scan_result->rssi,
+ scan_result->addr_type, scan_result->rssi,
adv_ind_len, adv_data_param,
scan_resp_len, scan_data_param);
/* Set VCONF Key for A2DP Connected status */
_bt_set_device_values(TRUE, VCONFKEY_BT_DEVICE_A2DP_HEADSET_CONNECTED);
+ /* Set readout notification of tts */
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+ _bt_set_readout_notification_of_tts();
+#endif
+
/* Send A2DP(SRC Role) connected event to Application */
param = g_variant_new("(is)", result, addr);
_bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AV_CONNECTED, param);
__bt_audio_set_avc_mode(mode);
/* Send the initial volume to application */
- _bt_send_event(BT_AVRCP_EVENT,
+ _bt_send_event(BT_HEADSET_EVENT,
BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
g_variant_new("(u)", absolute_volume));
}
return;
}
- _bt_send_event(BT_AVRCP_EVENT,
+ _bt_send_event(BT_HEADSET_EVENT,
BLUETOOTH_EVENT_AVRCP_VOLUME_CHANGED,
g_variant_new("(u)", absolute_volume));
}
/* Save the informations to invocation */
_bt_save_invocation_context(context, result, sender,
function_name, (gpointer)addr);
+
+ if (auto_connect)
+ _bt_handle_invocation_context(function_name, (void *)addr);
} else {
BT_ERR("GATT Client: gatt connect failed. client_id[%d]", client_id);
g_array_append_vals(*out_param1, &address,
}
+void _bt_free_paired_dev(void *paired_info)
+{
+ bt_remote_dev_info_t* dev_info = (bt_remote_dev_info_t*) paired_info;
+ unsigned int c;
+
+ ret_if(NULL == dev_info);
+
+ g_free(dev_info->address);
+ g_free(dev_info->name);
+ g_free(dev_info->alias);
+ g_free(dev_info->manufacturer_data);
+
+ for (c = 0; c < dev_info->uuid_count; c++)
+ g_free(dev_info->uuids[c]);
+ g_free(dev_info->uuids);
+ g_free(dev_info);
+}
+
static void __bt_get_service_list(bt_remote_dev_info_t *info, bluetooth_device_info_t *dev)
{
unsigned int i;
BT_ERR("vconf_set_int failed");
}
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+void _bt_set_readout_notification_of_tts(void)
+{
+ int tts_setting;
+
+ if (vconf_get_int(VCONFKEY_TTS_SETTING_NOTIFICATION_TTS, &tts_setting) != 0) {
+ BT_ERR("vconf_get_int failed");
+ return;
+ }
+
+ BT_DBG("current value[%d]", tts_setting);
+
+ if (tts_setting == -1)
+ if (vconf_set_int(VCONFKEY_TTS_SETTING_NOTIFICATION_TTS, -1) != 0)
+ BT_ERR("vconf_set_int failed");
+}
+#endif
+
int _bt_get_ad_data_by_type(char *in_data, int in_len,
char in_type, char **data, int *data_len)
{
if (!enabled) {
BT_DBG("Adapter disabled");
- g_slist_free_full(paired_list, g_free);
+ g_slist_free_full(paired_list, _bt_free_paired_dev);
paired_list = NULL;
bonded_list_retrieved = FALSE;
return;
{
BT_INFO("GATT deinit");
+ /* Un-register the default gatt client before */
+ __bt_unregister_gatt_client_instance(gatt_default_client);
+
if (OAL_STATUS_SUCCESS != gatt_disable())
BT_ERR("gatt deinit failed");
return connected;
}
+void _bt_handle_invocation_context(int function_name, void *data)
+{
+ switch (function_name) {
+ case BT_CONNECT_LE:
+ __bt_gatt_handle_pending_request_info(BLUETOOTH_ERROR_NONE, BT_CONNECT_LE,
+ (char *)data, BT_ADDRESS_STRING_SIZE);
+ break;
+ default:
+ break;
+ }
+}
int _bt_connect_le_device(bluetooth_device_address_t *address,
int auto_connect, int client_id)
void _bt_free_remote_dev(bt_remote_dev_info_t * dev_info);
+void _bt_free_paired_dev(void * paired_info);
+
void _bt_set_device_values(gboolean connected, int state);
+#ifdef TIZEN_FEATURE_READOUT_NOTIFICATION
+void _bt_set_readout_notification_of_tts(void);
+#endif
+
void _bt_string_to_uuid(char *str, service_uuid_t *p_uuid);
int _bt_get_ad_data_by_type(char *in_data, int in_len,
gboolean _bt_is_remote_gatt_device_connected(bluetooth_device_address_t *address);
+void _bt_handle_invocation_context(int function_name, void *data);
int _bt_connect_le_device(bluetooth_device_address_t *address,
int auto_connect, int client_id);