static void __bt_hal_handle_adapter_discovery_state_changed(void *buf, uint16_t len);
static void __bt_hal_handle_device_found_event(void *buf, uint16_t len);
static void __bt_hal_handle_bond_state_changed_event(void *buf, uint16_t len);
+static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len);
static bool interface_ready(void)
{
DBG("-");
}
+static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len)
+{
+ struct hal_ev_acl_state_changed *ev = (struct hal_ev_acl_state_changed*)buf;
+ bt_bdaddr_t bd_addr;
+ DBG("+");
+
+ memcpy(bd_addr.address, ev->bdaddr, 6);
+ /* BD address*/
+ DBG("[0x%x]", bd_addr.address[0]);
+ DBG("[0x%x]", bd_addr.address[1]);
+ DBG("[0x%x]", bd_addr.address[2]);
+ DBG("[0x%x]", bd_addr.address[3]);
+ DBG("[0x%x]", bd_addr.address[4]);
+ DBG("[0x%x]", bd_addr.address[5]);
+
+ DBG("ACL Status [0x%x]", ev->status);
+ DBG("ACL State [0x%x]", ev->state);
+
+ if (!bt_hal_cbacks->acl_state_changed_cb) {
+ ERR("HAL User acl_state_changed_cb is not set!!");
+ return;
+ }
+
+ bt_hal_cbacks->acl_state_changed_cb(ev->status, &bd_addr, ev->state);
+ DBG("-");
+}
+
static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len)
{
DBG("+");
DBG("Event: HAL_EV_BOND_STATE_CHANGED:");
__bt_hal_handle_bond_state_changed_event(buf, len);
break;
+ case HAL_EV_ACL_STATE_CHANGED:
+ DBG("Event: HAL_ACL_STATE_CONNECTED or Disconnected");
+ __bt_hal_handle_device_acl_state_changed_event(buf, len);
+ break;
default:
DBG("Event Currently not handled!!");
break;
static void __bt_hal_device_property_changed_event(GVariant *msg, const char *path);
static void __bt_hal_dbus_device_found_properties(const char *device_path);
static void __bt_hal_device_properties_lookup(GVariant *result, char *address);
+static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,const char *path);
+static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address);
static gboolean __bt_hal_discovery_finished_cb(gpointer user_data)
{
DBG("Manager Event: Interface Name:BT_HAL_AGENT_INTERFACE");
} else if (g_strcmp0(interface_name, BT_HAL_DEVICE_INTERFACE) == 0) {
DBG("Manager Event: Interface Name:BT_HAL_DEVICE_INTERFACE");
+ __bt_hal_handle_device_specific_events(parameters, signal_name, object_path);
}
return;
}
DBG("-");
}
+
+static void __bt_hal_send_device_acl_connection_state_event(gboolean connected, const char *address)
+{
+ DBG("+");
+ struct hal_ev_acl_state_changed ev;
+
+ ev.status = BT_STATUS_SUCCESS;
+ ev.state = (connected == TRUE) ?
+ HAL_ACL_STATE_CONNECTED :
+ HAL_ACL_STATE_DISCONNECTED;
+
+ _bt_convert_addr_string_to_type(ev.bdaddr, address);
+
+ if (!event_cb)
+ ERR("Bluetooth HAL event handler not registered");
+ else
+ event_cb(HAL_EV_ACL_STATE_CHANGED, &ev, sizeof(ev));
+ DBG("-");
+}
+
+static void __bt_hal_handle_device_specific_events(GVariant *msg, const char *member,
+ const char *path)
+{
+ char *address;
+ const char *property = NULL;
+ if (path == NULL)
+ return;
+
+ if (strcasecmp(member, "PropertyChanged") == 0) {
+ g_variant_get(msg, "(s)", &property);
+ if (property == NULL)
+ return;
+ if (strcasecmp(property, "GattConnected") == 0) {
+ /* TODO */
+ } else if (strcasecmp(property, "Paired") == 0) {
+ /* TODO */
+ } else if (strcasecmp(property, "UUIDs") == 0) {
+ /* TODO */
+ }
+ } else if (strcasecmp(member, "DeviceConnected") == 0) {
+ unsigned char addr_type = 0;
+
+ g_variant_get(msg, "(y)", &addr_type);
+
+ address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
+ _bt_convert_device_path_to_address(path, address);
+
+ DBG("Member: [%s]", member);
+ ERR_C("Connected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
+ __bt_hal_send_device_acl_connection_state_event(TRUE, address);
+ g_free(address);
+ } else if (strcasecmp(member, "Disconnected") == 0) {
+ unsigned char disc_reason = 0;
+ unsigned char addr_type = 0;
+
+ g_variant_get(msg, "(yy)", &addr_type, &disc_reason);
+
+ address = g_malloc0(BT_HAL_ADDRESS_STRING_SIZE);
+ _bt_convert_device_path_to_address(path, address);
+
+ DBG("Member: [%s]", member);
+ ERR_C("DisConnected [%s] [%s]", !addr_type ? "BREDR" : "LE", address);
+ DBG("Disconnect Reason: %d", disc_reason);
+ __bt_hal_send_device_acl_connection_state_event(FALSE, address);
+ g_free(address);
+ } else if (strcasecmp(member, "ProfileStateChanged") == 0) {
+ /* TODO */
+ } else if (strcasecmp(member, "AdvReport") == 0) {
+ /* TODO */
+ DBG("Member: [%s]", member);
+ }
+}