Qt Bluetooth in 5.5

Jef Driesen jef at libdivecomputer.org
Fri Mar 20 14:48:01 PDT 2015


On 2015-03-19 14:23, Lubomir I. Ivanov wrote:
> On 18 March 2015 at 05:48, Dirk Hohndel <dirk at hohndel.org> wrote:
>> 
>> Thiago,
>> 
>> would Subsurface benefit from using Qt Bluetooth for our intended 
>> Bluetooth integration?
>> This would cause some interesting architectural challenges with 
>> libdivecomputer (as that most definitely doesn’t want to depend on 
>> Qt), but I find it very intriguing that Qt now supports all of the 
>> platforms we are interested in… or am I missing something here?
>> 
> 
> i can see that libDC has a parser API exposed, but i don't know if /
> how does that works, but if Subsurface uses Qt's BT it can in theory
> just use libDC as a parser (Thiago mentioned the same).

It works (almost) exactly the same as for data downloaded from a dive 
computer. The parser doesn't care whether the data was downloaded with 
libdivecomputer or not.

There is only one extra complication. After downloading the dives with 
libdivecomputer, you typically use the dc_parser_new() function to 
create the parser. For parser backends that require some additional 
metadata (e.g. model number and clock synchronization timestamps), this 
function will automatically take care of transferring the metadata from 
the device layer to the parser. That's something you'll have to do 
manually.

> i think it would be better for the student to first help Jeff get the
> BT working in libDC for Win32 and Linux and then start working on the
> Subsurface side.

My prototype code is almost fully functional at this point. What's 
lacking is the proper integration in the libdivecomputer api. The way I 
did this for the prototype (with #ifdef's) is nothing more than a 
temporary hack. I have some ideas on how to do this properly (see 
details below). But this will require some major redesign of the api, 
and therefore will have to be postponed until after the next v0.5 
release.

The main idea for the api change is as follows. Instead of passing the 
name of the serial port to the dc_device_open() function, and let 
libdivecomputer open the serial port internally, this will now be 
delegated to the application:

dc_serial_t *serial = NULL;
dc_device_t *device = NULL;

/* Open the serial port. */
dc_serial_open(&serial, devname);

/* Open a connection to the device. */
dc_device_open(&device, context, descriptor, serial);

/* TODO: Download dives here (same as before). */

/* Free resources */
dc_device_close(device);
dc_serial_close(serial);

The main benefit is that this change will allow us to pass something 
else than just a string (with the name of the serial port). For devices 
that use bluetooth communication, the application opens a bluetooth 
socket, and passes that to the dc_device_open() function:

dc_bluetooth_t *bluetooth = NULL;

/* Open a bluetooth socket. */
dc_bluetooth_open(&bluetooth, macaddress);

/* Open a connection to the device. */
dc_device_open(&device, context, descriptor, bluetooth);

Note that applications can query the device descriptor to figure out 
whether a device uses serial or bluetooth communication. That 
functionality is already present.


There are two other important advantages too. This will also allow us to 
expose the built-in serial port enumeration (and for bluetooth the 
device discovery) to the application. It will also makes it possible to 
implement user-space serial drivers for mobile devices (e.g. Android and 
iOS) where we typically don't have the required usb-serial kernel 
drivers.

> but...if the OSX code is not going to be donated soon (or maintained
> well in that aspect), i suggest we just use Qt's BT.

As Dirk mentioned, a dependency on Qt is far from ideal for 
libdivecomputer. So I would like to avoid that. But at the moment I see 
no reason to use Qt on Windows and Linux. The main problem will be Mac 
OS X. But I think that if we can already support bluetooth on Windows 
and Linux, that would already be a nice improvement. Worst case 
scenario, Mac users will have to stick with the serial emulation a bit 
longer.

> there is also the option for libDC to expose API to allow the libDC
> user to specify the BT backend (e.g.. built-in VS external C-wrapped
> Qt BT), but that's probably a ton of extra work for Jeff.

I already considered this, but I believe it's a very bad idea in the 
long term. Because the low level communication is maintained as a 
built-in backend today, all applications are equal and are able to 
support the same set of devices. But that will no longer be true when 
applications can use their own backend. Then you'll end up with a 
situation where application X can support a certain device, while 
application Y can't. Remember that not all libdivecomputer based 
applications are open source! (Note that I don't mind closed source apps 
using libdivecomputer. But I do mind closed source improvements that are 
not contributed back. I picked the LGPL license for a reason.)

Jef


More information about the subsurface mailing list