Dirk,

Sorry for the slow response. Been busy with real life.

On 2015-06-17 16:45, Dirk Hohndel wrote:
I don't know which other apps use libdivecomputer, but the ones that I
know about...

Subsurface: happy to implement a Bluetooth backend, happy to use the
existing libdivecomputer communication layer otherwise

MacDive: doesn't use libdivecomputer at all for communication and only
uses some of your parsers

I think you are mistaken here. As far as I know, Macdive does use libdivecomputer for the communication (except for the cobalt I believe). You are right that Macdive has a few custom parsers, but that's mainly for historic reasons. Back in the early days, libdivecomputer didn't support some features that MacDive needed. Nowadays we support most of them, but you know: if it ain't broken don't fix it :-)

DivingLog: wouldn't know which end of a C library is up and therefore has you do all his work for him. Couldn't implement a low-level I/O function
to save his business model

(OK, that was harsh, but I'll be interested in someone proving me wrong)

Anyone is free to use his/her preferred programming language for his/her own project, right? I can't write an application in assembler (and many other programming languages) either :-)

I'm sure it will be possible to write a low-level I/O backend in .NET too.

Who else?

There are many more. I maintain a (possible incomplete) list on the libdivecomputer website:

http://libdivecomputer.org/links.html#applications

My point is... does the fact that you implement all of the dive computer code for DivingLog impact your view of what other applications might want
from libdivecomputer?

No it doesn't. I think you greatly overestimate my involvement with Diving Log. Yes, I did spend quite some time to figure out how to use libdivecomputer from .NET code (and by doing that I learned how to make sure that the public api is usable from non C/C++ code). But that's already several years ago. Nowadays it's limited to building the libdivecomputer dll and notifying Sven about changes when necessary. I have (and need) the windows build setup anyway, so why not? It's just a few minutes of work once in a while.

And applications benefit from being able to add things that aren't in
libdivecomputer and that likely won't be in libdivecomputer for a loooong
time. When do you think your Android Bluetooth support will be ready to
ship? What about your Mac Bluetooth support?

If we can have a callback into the app then we'll have both working in
Subsurface by the end of this summer.

I think you already know my answer: I have no idea, but definitely not by the end of this summer. (Note that a callback based interface won't be available by that time either.) But nobody says you have to wait until *I* have time to implement some code for Android, Mac or whatever OS. Patches with support for those OS'es are always welcome...

I'm aware there are good technical arguments in favor of a custom I/O layer too. For example a Qt based application like subsurface can easily take advantage of the bluetooth support in the Qt framework, while other applications may not appreciate such a (huge) dependency. But that's another story.

2. If applications are responsible for the low-level communication, then the list of supported dive computers will depend on which protocols have been
implemented by the application. Thus two applications using the same
libdivecomputer library may not support the same set of dive computers. That's not only confusing, but may also give closed source applications a
competitive advantage: A closed source application could implement a
low-level communication backend and decide not to share it with everyone else. (This might be considered an ideological issue, and not a technical one. But since this happens to be one of the reason why libdivecomputer is
an open source library, this matters to me!)

You are missing the point. Really. We are not saying "stop doing it in
libdivecomputer". We are saying "offer the app a chance to register a
callback". If it's there, use it. If it isn't, do what you are doing
today.

That was a bit of a misunderstanding then. I initially understood you wanted to keep all bluetooth code out of libdivecomputer, and have the custom backend as the only option.

3. Right now, the api for the low-level communication is a private api. This has several advantages. First of all, that allows me to change the api when necessary, without having to worry about backwards compatibility. Once I provide some callback interface, that will become part of the public api.
But that's not all.

Second, and even more important, is that a custom communication backend won't be able to take advantage of other internal api's, like the logging infrastructure. That's a really important feature for me, because it greatly
simplifies troubleshooting and debugging.

4. We already have a working proof of concept for native bluetooth
communication, which supports Linux and Windows. So I don't see any reasons
why we would need a custom implementation there.

Because you don't understand how other apps besides DivingLog want to use your library. If it's not available on Mac it doesn't help about a quarter of my users. And I expect that by the end of summer we'll have an Android app as well and I'll bet good money that that will be quite popular very quickly. And the main reason all the dive computer vendors are coming out with BT devices is because it's so hard to do USB downloads on Android and
IOS.

So you want this functionality for *YOUR* users. Am I right that you probably don't really care much about other applications? Although I can understand such point of view, that's exactly the point I wanted to make!

Let's assume for a moment that libdivecomputer supports custom I/O implementations. Now, if one application (let's call it "X") implements its own low-level bluetooth I/O for Mac, then only the users of that specific application will be able to use bluetooth devices. But all other Mac applications will still be left without bluetooth support! No doubt I'll quickly start receiving questions why application X supports this, but not their favourite application :-(

[This is already the case today. IrDA devices (Uwatec Smart/Galileo) are not supported on Mac either. I certainly get questions about that on a regular basis, and I'm sure you get them from subsurface users too.]

Now, if this application is an open source application, like subsurface, then other (open source) applications can easily re-use the low level I/O code. In that case I don't mind at all. (Just like I don't mind you are currently using a modified libdivecomputer for subsurface.) But remember that libdivecomputer is also used by (many) closed source applications! If one those closed source applications implements a custom I/O backend, then that gives them a competitive advantage, while nobody else can re-use their work. That's the kind of situation I don't like.

Right now, anyone modifying libdivecomputer without making those modifications available, is strictly speaking violating the lgpl license. But once libdivecomputer provides the infrastructure for custom I/O backends, then that's no longer the case. That's the main reason why I'm a bit sceptical about supporting custom I/O. Does that mean I won't consider this idea? Of course not!

On the technical side, I'm sure we can work out the details and come up with a solution that does satisfy the needs of both applications and libdivecomputer. See for example the proposal in one of my previous emails [1].

[1] http://lists.subsurface-divelog.org/pipermail/subsurface/2015-June/019984.html

Jef
_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to