#include "bt-service-dpm.h"
#endif
#include "bt-service-hidhost.h"
+#include "bt-service-hiddevice.h"
#include "bt-service-socket.h"
#include "bt-service-hdp.h"
static guint timer_id = 0;
-static gboolean a2dp_init_pending = FALSE;
+static gboolean a2dp_init_pending = TRUE;
/* Adapter default states */
static bt_status_t adapter_state = BT_DEACTIVATED;
int _bt_enable_adapter(void)
{
+ bt_le_status_t le_status = BT_LE_DEACTIVATED;
+
+ le_status = _bt_adapter_get_le_status();
+
+ BT_INFO("Current state [%d], LE [%d]", adapter_state, le_status);
+
+ if (adapter_state == BT_ACTIVATING || le_status == BT_LE_ACTIVATING) {
+ BT_ERR("Enabling in progress");
+ return BLUETOOTH_ERROR_IN_PROGRESS;
+ }
+
+ if (adapter_state == BT_ACTIVATED) {
+ BT_ERR("Already enabled");
+ return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
+ }
+
+ if (adapter_state == BT_DEACTIVATING ||
+ adapter_state == BT_TERMINATING ||
+ le_status == BT_LE_DEACTIVATING) {
+ BT_ERR("Disabling in progress");
+ return BLUETOOTH_ERROR_DEVICE_BUSY;
+ }
+
return __bt_adapter_state_handle_request(TRUE);
}
int _bt_disable_adapter(void)
{
+ bt_le_status_t le_status = BT_LE_DEACTIVATED;
+
+ le_status = _bt_adapter_get_le_status();
+
+ BT_INFO("Current state [%d], LE [%d]", adapter_state, le_status);
+
+ if (adapter_state == BT_DEACTIVATING ||
+ adapter_state == BT_TERMINATING ||
+ le_status == BT_LE_DEACTIVATING) {
+ BT_DBG("Disabling in progress");
+ return BLUETOOTH_ERROR_IN_PROGRESS;
+ }
+
+ if (adapter_state == BT_DEACTIVATED) {
+ BT_DBG("Already disabled");
+ return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+ }
+
+ if (adapter_state == BT_ACTIVATING || le_status == BT_LE_ACTIVATING) {
+ BT_ERR("Enabling in progress");
+ return BLUETOOTH_ERROR_DEVICE_BUSY;
+ }
+
+ /* TODO: Need to add the function to disconnect all devices */
+ /* __bt_disconnect_all(); */
+
return __bt_adapter_state_handle_request(FALSE);
}
return BLUETOOTH_ERROR_NONE;
}
-static void __bt_handle_pending_a2dp_init(service_uuid_t *service_list, unsigned int count)
+static void __bt_handle_pending_a2dp_init(unsigned int a2dp_role)
{
int ret;
- unsigned int i;
- unsigned char *uuid;
- char uuid_str[BT_UUID_STRING_SIZE];
if (!a2dp_init_pending)
return;
BT_DBG("+");
a2dp_init_pending = FALSE;
- for (i = 0; i < count; i++) {
- uuid = service_list[i].uuid;
- _bt_service_convert_uuid_type_to_string(uuid_str, uuid);
- BT_INFO("Adapter Service: [%s]", uuid_str);
- if (!strcasecmp(uuid_str, A2DP_SINK_UUID)) {
- BT_INFO("Enable A2DP Sink role");
- /* Initialize A2DP Sink */
- ret = _bt_audio_initialize(BT_A2DP_SINK_MODULE);
- if (ret != BLUETOOTH_ERROR_NONE)
- BT_ERR("_bt_audio_initialize(BT_A2DP_SINK_MODULE) Failed");
-
- /* Initialize AVRCP Controller */
- ret = _bt_audio_initialize(BT_AVRCP_CTRL_MODULE);
- if (ret != BLUETOOTH_ERROR_NONE)
- BT_ERR("_bt_audio_initialize(BT_AVRCP_CTRL_MODULE) Failed");
-
- _bt_audio_set_current_role(BLUETOOTH_A2DP_SINK);
- return;
- }
+
+ if (a2dp_role == BT_A2DP_SINK_ROLE) {
+ BT_INFO("Enable A2DP Sink role");
+ /* Initialize A2DP Sink */
+ ret = _bt_audio_initialize(BT_A2DP_SINK_MODULE);
+ if (ret != BLUETOOTH_ERROR_NONE)
+ BT_ERR("_bt_audio_initialize(BT_A2DP_SINK_MODULE) Failed");
+
+ /* Initialize AVRCP Controller */
+ ret = _bt_audio_initialize(BT_AVRCP_CTRL_MODULE);
+ if (ret != BLUETOOTH_ERROR_NONE)
+ BT_ERR("_bt_audio_initialize(BT_AVRCP_CTRL_MODULE) Failed");
+
+ _bt_audio_set_current_role(BLUETOOTH_A2DP_SINK);
+ return;
}
- BT_INFO("Enable A2DP Source role by default");
+ BT_INFO("Enable A2DP Source role");
/* Initialize A2DP Source */
ret = _bt_audio_initialize(BT_A2DP_SOURCE_MODULE);
if (ret != BLUETOOTH_ERROR_NONE)
count = list->num;
service_list = list->service_list;
- __bt_handle_pending_a2dp_init(service_list, count);
__bt_adapter_handle_pending_requests(BT_IS_SERVICE_USED, service_list, count);
break;
}
g_free(addr_list);
break;
}
+ case OAL_EVENT_ADAPTER_PROPERTY_A2DP_ROLE: {
+ unsigned int *a2dp_role = event_data;
+
+ BT_INFO("a2dp role: [%u]", *a2dp_role);
+
+ __bt_handle_pending_a2dp_init(*a2dp_role);
+
+ break;
+ }
default:
BT_ERR("Unhandled event..");
break;
if (ret != BLUETOOTH_ERROR_NONE)
BT_ERR("_bt_hidhost_initialize Failed");
+ ret = _bt_hiddevice_initialize();
+ if (ret != BLUETOOTH_ERROR_NONE)
+ BT_ERR("_bt_hiddevice_initialize Failed");
+
ret = _bt_socket_init();
if (ret != BLUETOOTH_ERROR_NONE)
BT_ERR("_bt_socket_init Failed");
- /*
- * Query local adapter services and based on a2dp service uuids initialized
- * in bluetooth stack, enable A2DP sourec or A2DP sink role.
- */
- ret = adapter_get_service_uuids();
- if (ret != OAL_STATUS_SUCCESS)
- BT_ERR("adapter_get_service_uuids failed: %d", ret);
- else
- a2dp_init_pending = TRUE;
-
-
/* Initialize HFP Audio Gateway */
ret = _bt_audio_initialize(BT_AG_MODULE);
if (ret != BLUETOOTH_ERROR_NONE)
//_bt_audio_deinitialize(BT_AG_MODULE);
//_bt_audio_deinitialize(BT_AVRCP_CTRL_MODULE);
//_bt_audio_deinitialize(BT_AUDIO_ALL_MODULE);
+
+ a2dp_init_pending = TRUE;
#endif
_bt_hdp_deinit();
_bt_gatt_deinit();
/* TODO:Add timer function to handle any further post processing */
g_idle_add((GSourceFunc)__bt_adapter_post_set_enabled, NULL);
- /*Return BT_ADAPTER_ENABLE Method invocation context */
- __bt_adapter_handle_pending_requests(BT_ENABLE_ADAPTER, NULL, 0);
/*Send BT Enabled event to application */
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
g_variant_new("(i)", result));
/* TODO:Add timer function to handle any further post processing */
g_idle_add((GSourceFunc)__bt_adapter_post_set_disabled, NULL);
- /* Return BT_ADAPTER_DISABLE Method invocation context */
- __bt_adapter_handle_pending_requests(BT_DISABLE_ADAPTER, NULL, 0);
-
/* Send BT Disabled event to application */
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
g_variant_new("(i)", result));
switch (bt_status) {
case BT_DEACTIVATED:
- __bt_adapter_state_set_status(bt_status);
+ __bt_adapter_state_set_status(BT_TERMINATING);
/* Adapter is disabled, unregister event handlers */
_bt_service_unregister_event_handler_callback(BT_ADAPTER_MODULE);
BT_DBG("");
switch (adapter_state) {
- case BT_ACTIVATING: {
- BT_INFO("Adapter is currently in activating state, state [%d]",
- adapter_state);
- if (enable) {
- return BLUETOOTH_ERROR_IN_PROGRESS;
- } else {
- if (adapter_discovery_state == ADAPTER_DISCOVERY_STARTED ||
- adapter_discovery_state == ADAPTER_DISCOVERY_STARTING) {
- /*TODO Stop Discovery*/
- __bt_adapter_update_discovery_status(FALSE);
- }
- result = adapter_disable();
- if (result != OAL_STATUS_SUCCESS) {
- BT_ERR("adapter_enable failed: [%d]", result);
- result = BLUETOOTH_ERROR_INTERNAL;
- /*TODO: perform if anything more needs to be done to handle failure */
- } else {
- /* TODO: To be handled */
- __bt_adapter_state_set_status(BT_DEACTIVATING);
- result = BLUETOOTH_ERROR_NONE;
- }
- }
+ case BT_ACTIVATING:
+ case BT_DEACTIVATING:
+ BT_INFO("Should not be callded : state [%d]", adapter_state);
+ return BLUETOOTH_ERROR_INTERNAL;
break;
- }
case BT_ACTIVATED: {
BT_INFO("Adapter is currently in activated state, state [%d]",
adapter_state);
}
break;
}
- case BT_DEACTIVATING: {
- BT_INFO("Adapter is currently in deactivating state, state [%d]",
- adapter_state);
- if (!enable) {
- return BLUETOOTH_ERROR_IN_PROGRESS;
-
- } else {
- result = adapter_enable();
- if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) {
- BT_ERR("adapter_enable failed: [%d]", result);
- adapter_disable();
- result = BLUETOOTH_ERROR_INTERNAL;
- /*TODO: perform if anything more needs to be done to handle failure */
- } else {
- /* TODO: To be handled */
- __bt_adapter_state_set_status(BT_ACTIVATING);
- result = BLUETOOTH_ERROR_NONE;
- }
- }
- break;
- }
case BT_DEACTIVATED: {
BT_INFO("Adapter is currently in deactivated state, state [%d]",
adapter_state);