On 2014-03-03 15:41, Dirk Hohndel wrote:
On Mon, 2014-03-03 at 15:24 +0100, Anton Lundin wrote:
For subsurface we don't need no stinking jni wrappers, we run real
code! =)
Correct. As native app we can call native code directly.
I'm aware of that, but I'm thinking a bit broader. Subsurface isn't the
only application using libdivecomputer :-)
Kernel drivers is a no-go if you would like to support anything but
hand-built roms. Not even CM ships any kernel-modules.
I've seen libusb based drivers for at least ftdi and acm based things,
and ftdi is what my dc's use so I'm happy with atleast that =)
ftdi is one of the most common ones. But there are a few more. And of
course there are a few divecomputers that use different protocols.
Let's
forget for a moment about the iRDA ones... but there's Bluetooth
(shouldn't be too hard - Android does have a Bluetooth stack... all we
need is to use that directly instead of the serial emulation that
current libdivecomputer still uses), some use full USB - with libusb
available, that should be possible, too. And then of course there is
the
UEMIS that simulates a FAT filesystem. That should be reasonably
straight forward as well.
Yes, being able to get rid of the bluetooth emulation would be really
nice.
Assume we manage to implement the necessary userspace driver, how do
we
integrate this nicely into libdivecomputer? This a question for which
I have
no good answer at the moment. Right now, an application simply passes
the
device node (e.g. /dev/ttyXXX), and libdivecomputer takes care of
opening
the serial port. This works well because there is just one driver for
each
platform. But once we have multiple serial drivers, we'll also need
some
mechanism to select the right driver.
From what I've understod about usb-devices on android is that you need
to call a user consent dialog from your app (java thingie, but you can
call into java from c++ so thats not a problem), and then the system
chown/setfacl the device so your app have rights to access it.
My guess would be to have a way to map all the serial calls in
libdivecomputer to external functions that can be implemented outside
libdivecomputer, for ex in the app that interfaces with the rest of
the
world.
From the top of my head that would be building libdivecomputer without
any serial_*.c or maybe a serial_external.c that implements all the
things that libdivecomputer needs, that can be enabled compile time.
That sounds like the right approach.
What I have been thinking about is to turn the serial code into an
interface, and then we can have multiple implementations of that
interface. The current serial backend would be one of those
implementation. For the application, instead of passing the device node
for the serial port to the dc_device_open() function, it would create an
instance of the new interface and pass that. Then the application can
pick the right implementation. For Linux, Windows and Mac OS X, the
default implementation would be sufficient.
Thus in the application, the code would look something like this:
dc_serial_t *serial = NULL;
dc_device_t *device = NULL;
/* Create an instance of the serial port interface.
* Here I just use the default implementation, but
* that can of course be replaced with another one. */
dc_serial_open(&serial, devname);
/* Open a connection to the device. */
dc_device_open(&device, ..., serial);
/* Close the connection. */
dc_device_close(device);
dc_serial_close(serial);
The downside is the extra code on the application side. Although a nice
side effect is that it would also solve the enumeration problem. Right
there is a function to enumerate serial ports, but because the serial
code is private, applications can't really use it.
Jef
_______________________________________________
subsurface mailing list
[email protected]
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface