2009-07-28 11:55:17

by Alexander H Deriziotis

[permalink] [raw]
Subject: non-blocking hci_inquiry()

Hi,

I've been playing with the linux wiimote daemon called Cwiid, and
noticed that while it's waiting for a connection from a wiimote, it's
blocking the bluetooth adapter from doing anything else.

Searching around and looking at the code, I can see it's calling
hci_inquiry() in a loop which is blocking the device.

Does a non-blocking hci_inquiry() function exist? If not, could I get
some help on how to go about writing one?

Looking around, someone mentions that it might be the ioctl() function
called within hci_inquiry() which is causing the blocking, could it be
something as trivial as playing with that?

from lib/hci.c:

int hci_inquiry(int dev_id, int len, int nrsp, const uint8_t *lap,
inquiry_info **ii, long flags)
{
[snip]
??????? ret = ioctl(dd, HCIINQUIRY, (unsigned long) buf);
??????? if (ret < 0)
??????????????? goto free;


Many thanks,

Alex


2009-07-28 12:31:44

by Marcel Holtmann

[permalink] [raw]
Subject: Re: non-blocking hci_inquiry()

Hi Alex,

> I've been playing with the linux wiimote daemon called Cwiid, and
> noticed that while it's waiting for a connection from a wiimote, it's
> blocking the bluetooth adapter from doing anything else.
>
> Searching around and looking at the code, I can see it's calling
> hci_inquiry() in a loop which is blocking the device.
>
> Does a non-blocking hci_inquiry() function exist? If not, could I get
> some help on how to go about writing one?

use the D-Bus interface for non-blocking inquiry.

Regards

Marcel



2009-08-12 22:40:21

by Marcel Holtmann

[permalink] [raw]
Subject: Re: non-blocking hci_inquiry()

Hi Alex,

> > use the D-Bus interface for non-blocking inquiry.
>
> I'm following the GLib with C example in the following doc:
> http://wiki.bluez.org/wiki/HOWTO/DiscoveringDevices and having
> problems running the example code.
>
> It compiles perfectly fine, however, when I run it, it gives me the
> following error:
>
> jackflap@genesis:~/Desktop/cwiid-0.6.00/new_test$ ./bluetooth
> Failed to discover devices: Method "DiscoverDevices" with signature ""
> on interface "org.bluez.Adapter" doesn't exist
>
> I'm getting the impression that it's the following line in the code
> that isn't working:
>
> obj = dbus_g_proxy_new_for_name(bus, "org.bluez",
> "/org/bluez/hci0", "org.bluez.Adapter");
>
> I'm certain my bluetooth adapter is recognized and is configured as hci0.

looks like you are not using the 4.x API. That one works differently.

Regards

Marcel



2009-08-12 22:37:03

by Alexander H Deriziotis

[permalink] [raw]
Subject: Re: non-blocking hci_inquiry()

Hi Marcel,

2009/7/28 Marcel Holtmann <[email protected]>:
>
> use the D-Bus interface for non-blocking inquiry.

I'm following the GLib with C example in the following doc:
http://wiki.bluez.org/wiki/HOWTO/DiscoveringDevices and having
problems running the example code.

It compiles perfectly fine, however, when I run it, it gives me the
following error:

jackflap@genesis:~/Desktop/cwiid-0.6.00/new_test$ ./bluetooth
Failed to discover devices: Method "DiscoverDevices" with signature ""
on interface "org.bluez.Adapter" doesn't exist

I'm getting the impression that it's the following line in the code
that isn't working:

obj = dbus_g_proxy_new_for_name(bus, "org.bluez",
"/org/bluez/hci0", "org.bluez.Adapter");

I'm certain my bluetooth adapter is recognized and is configured as hci0.

What am I missing?

Thanks,
Alex