Dive data import error with Hollis DG03

Jef Driesen jef at libdivecomputer.org
Mon Mar 24 05:49:23 PDT 2014


On 2014-03-24 12:35, Hamish Moffatt wrote:
> On 24/03/14 21:21, Jef Driesen wrote:
>> 
>> Or make it persistent by disable the low_latency flag when opening the 
>> serial port in libdivecomputer. See the attached patch for a prototype 
>> implementation. On Linux, it will clear the low_latency flag, without 
>> setting the latency_timer value, because that requires root 
>> permissions. But based on the info we gathered so far, that should 
>> already do the trick. On Mac OS X, it seems possible to set the 
>> latency timer directly, although I have no idea whether that actually 
>> works or not.
>> 
>> Can anyone give this a try?
>> 
> Isn't this the wrong solution? As best I can tell, the dive computer
> needs a bit of delay between commands, which it gets by accident due
> to the read latency. The default read latency works on Windows and
> Mac, but those could be changed by the user. The default read latency
> doesn't work on linux.
> 
> A short delay within libdivecomputer won't even be noticeable on
> systems where the default read latency is already larger.

I'm certainly not claiming it's a perfect solution, but the alternative 
is far from perfect too.

If we just add some unconditional delay before the write, then we're 
also increasing the download time for systems where there is already a 
delay due to the higher latency timer.

Let's say we have a Windows system where the default latency timer is 
16ms. There, every read operation (or at least the first one for each 
packet) will already take approximately 16ms. If we add an extra 16ms 
sleep before writing the request, then we are doubling the total wait 
time, while it's not even necessary. Compared to the total time it takes 
to request/receive a packet that is a lot. Roughly a 100% increase. The 
fact that we are dealing with tiny 16 byte packets doesn't make it any 
nicer. With 64K of memory (4096 packets), a full dump would take 40 
seconds extra (with a 10ms delay).

Ideally we need a way to add this small delay, only for those systems 
that really need it. We could throw in a conditionally compiled sleep 
for linux only:

#ifdef __linux__
     serial_sleep (device, 10);
#endif

But besides the fact that I don't like seeing conditionally compiled 
code in otherwise platform independent code (in the serial code itself I 
don't mind, because that's where it belongs), it won't help other 
systems that have the low latency enabled. Either by default or because 
the user changed the default. It will also break or slowdown if the 
kernel ever changes the default latency timer again.

Ideally we need a solution that only introduces a delay when strictly 
necessary. For example by checking the low_latency flag and/or latency 
timer, or measuring it (like we do for the halfduplex workaround).

Maybe we can introduce some kind of adaptive delay? We start with no 
delay at all, and if we get too many nak's or timeouts, we increase the 
delay. On systems where no delay is necessary, the extra delay will 
never get activated. But for systems where it is necessary, it would get 
activated after a few failed packets. What do you think?

This adaptive delay is something I already considered a long time ago 
for the delay in the error retrying. Now it's just hardcoded to 100ms, 
but it might be better to increase it dynamically after successive 
failures. I just never had time to try this.

Jef


More information about the subsurface mailing list