2093 Commits

Author SHA1 Message Date
Michael Keller
76170009b4 Garmin: Add Support for Parsing of Garmin Descent Mk3 FIT files.
Add support for FIT files generated by the Garmin Descent Mk3.
This just fixes a field number limitation, it has not yet been
verified that the Mk3 file format is properly interpreted by Subsurface.

Signed-off-by: Michael Keller <mikeller@042.ch>
2024-01-22 12:54:02 +13:00
Michael Keller
577b694087
Merge pull request #54 from mikeller/improve_cressi_leonardo_ascent_warnings 2023-08-01 21:43:41 +12:00
Michael Keller
58ea31e62e Cressi Leonardo: Turn ascent warnings into info events.
According to user feedback the ascent warnings on the Cressi Leonardo
are very sensitive. They come in 3 different levels.
This change turns levels 1 and 2 into info events, leaving only 3 as a
warning.
Fixes https://groups.google.com/g/subsurface-divelog/c/qBXF0wmyjKg/m/5qA0_KABCQAJ

Signed-off-by: Michael Keller <github@ike.ch>
2023-07-28 00:02:14 +12:00
Michael Keller
97b2c89aaa
Merge pull request #52 from mikeller/hw_ostc_mark_inactive_gases 2023-07-23 15:43:32 +12:00
Linus Torvalds
3e39cb427a garmin: fix up some leftovers
When importing FIT files, we may not have serial numbers or firmware
versions in the result, so don't report them when they don't exist.

Also, add the product name to the FILE message field list, which can
contain relevant information.  Not that we report it right now, but now
we *could* do so.

This concludes the Suunto FIT file export saga.  It's not great, but it
looks like it should be usable.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 11:28:33 -07:00
Linus Torvalds
e81eca685a garmin: add a _third_ time offset field
So FIT files seem to have many many different ways to describe time
offsets.  And I'm not talking about the overall Garmin time offset of
631065600, which is the conversion from the "Unix Epoch" (Jan 1, 1970)
to the "Garmin Epoch" (Dec 31, 1989).

No, I'm talking just about "device time" to "local time" to "UTC"
conversions.

The DEVICE_SETTINGS message has two different fields for time offsets:
there's a "UTC offset" (presumably this is the timezone the device is
set to), and a "time offset" which we actually use to transform the
recorded time of the dive into the local time that we report.

But the Suunto FIT export doesn't seem to use either of those, and
instead Nick Clark points outthe Suunto FAQ:

 "Timestamp fields are deliberately defined as UTC time so that they may
  be conveniently displayed in the local time if so desired.

  In some instances it is useful to know the UTC offset when the file
  was generated (possibly different from when it is decoded). This can
  be accomplished by logging a single message containing both a
  local_timestamp and a timestamp field. This will establish the UTC
  offset of the file.

  Presently these fields are predefined for activity and monitoring
  messages"

so to get the actual local time, instead of getting it from the
DEVICE_SETTINGS message, we now have to parse the ACTIVITY message, and
take the difference between the regular timestamp and the
"local_timestamp" field.

The great thing about standards is that there are so many to choose
from.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 11:17:32 -07:00
Linus Torvalds
dc8f32609e garmin: add 'FIELD_DESCRIPTION' message definitions
We don't use them, but they seem to be trying to describe what the
developer fields are used for.  We may now parse the developer fields
enough to skip over them gracefully, but it looks like we migth some day
want to _really_ parse them, and while I haven't figured it out (at
all!) yet, this may some day help.

For example, we get things like this:

  FIELD_DESCRIPTION_name (STRING): "Depth"
  FIELD_DESCRIPTION_unit (STRING): "feet"
  FIELD_DESCRIPTION_original_mesg (UINT16): 20
  FIELD_DESCRIPTION_data_index (UINT8): 0
  FIELD_DESCRIPTION_field_definition (UINT8): 0
  FIELD_DESCRIPTION_base_type (UINT8): 136

which doesn't tell me anything at all right now, but looks like maybe it
should some day.

It looks like this is defining a developer field for depth in feet
(duh), and the data format may be the same as a RECORD message (20),
which does indeed normally contain the depth (but in mm as an UINT32,
and it's field number 92, so..)

End result: not useful right now, because I'm much too confused about
it.  But the debug printout looks interesting.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 11:01:00 -07:00
Linus Torvalds
196cfdf4df garmin: add names for a few RECORD message fields
Not because we use them, but because it makes it clearer from the debug
output that we know what they are and that they aren't interesting..

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 11:01:00 -07:00
Linus Torvalds
503afc1a5f garmin: improve on the debug formatting for field printouts
This also gets the passing of string values right, even if we don't
actually use this right now.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 11:00:52 -07:00
Linus Torvalds
e02df46a2b garmin: remove some left-over verbose hexdump debugging
This was part of me trying to figure out the compressed formats and the
developer fields, it's just noise now.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-16 09:56:12 -07:00
Linus Torvalds
2879bd69a5 Garmin: parse the ACTIVITY message record
The ACTIVITY message contains a "local timestamp" in addition to the
regular timestamp. That gives us the timezone information.

Or rather, it would give us the timezone info if we actually used it.
But now we at least parse it, so that we *could* use it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-15 10:11:04 -07:00
Linus Torvalds
4a2dec531e garmin: relax file name length rules
We end up using the FIT file name as the "fingerprint" for the dive, and
include it at the beginning of the dive data as such.  And because of
how Garmin encoded the FIT files, we ended up having a fixed 24-byte
length for this, which is normally the date encoding:

    YYYY-MM-DD-HH-MM-SS.FIT

with the terminating NUL character.

Of course, then Garmin started using a short-form encoding too
(presumably due to FAT filesystem limits), and we have magic code to
sort the dates properly, using the name format

    YMDHMMSS.FIT

with the numbers encoded in a shorter format (eg "C4ND0302.fit" is
equivalent to "2022-04-23-13-03-02.fit").  See name_cmp() and
parse_short_name() for details.

Anyway, because we use the (zero-padded) 24 characters of the name as
the fingerprint, we used a fixed-size buffer for the filename that was
limited to that maximum size Garmin creates.

But then you download those things, and have multiple vendors, and
suddenly that 24-character limit on the filename is very annoying.

Instead of fixing this in some clean and generic way, let's just raise
the namelength limit to something bigger, and continue to use the first
24 characters of the name for the fingerprint.

Pretty it isn't, but it makes it slightly easier to import random FIT
files that don't conform exactly to the traditional Garmin format.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-14 12:31:33 -07:00
Linus Torvalds
67cd1cc0fd Expose FIT file parsing as its own "vendor"
Since we can now parse FIT files from other vendors than Garmin (ie the
Suunto FIT file export), let's expose this as a generic "FIT file
import" in the dive computer list.

It's all still very much using the Garmin parser, but uses a model ID
that is zero.  The only difference that makes is that it also tells the
parser to treat the result as a dive even if it cannot find the actual
dive markers that Garmin uses, since those won't exist in the limited
FIT file export.

This is still somewhat inconvenient, in that you cannot point to the
file itself, you can just point to the directory that contains FIT
files.  And right now we have an artifical length limitation on the
filenames, but I'll fix that next.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-14 12:07:30 -07:00
Linus Torvalds
929ce47155 garmin_parser: add support for developer fields
This was the _actual_ reason why the Suunto FIT file import fell flat on
its face: it adds records with developer fields in them, and I just had
no idea how to parse them.

It turns out that they aren't all *that* horrible to parse: they are
kind of like a special case of the regular FIT event fields.

And no, this does not really parse them: it only parses the layout, and
using that it can then skip the developer fields without causing the
decoder to go all wonky and lose stream synchronization.

At least it works for the specific case of the Suunto FIT files, and the
code makes some amount of sense.  The FIT format may be odd, but at the
same time it's most definitely designed for pretty simplistic devices,
so it's not some kind of crazy XML thing.

This gets us parsing those Suunto FIT files at least partially.

That said, it is all very rough indeed, since you have to lie and claim
you're downloading from a Garmin, and have to set up the whole magic
'Garmin/Activity/' directory structure and limit the file size to the 24
characters that Garmin uses.

So this is by no means the real solution.

Considering that Jef doesn't want the Garmin parser in libdivecomputer
anyway, the proper solution might be to move this all to subsurface, and
make it be a "FIT file import" thing instead.  Annoying, but on the
other hand it has also been a bit awkward to have it in libdivecomputer.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-13 14:01:58 -07:00
Linus Torvalds
147d3df635 garmin_parser: add support for compressed records and more debug output
This turns out to have been another false turn: mis-parsing the FIT file
caused us to think it had compressed records.

So I spent much too much time trying to figure out how those compressed
records actually work.  This is the result.

It looks like the only difference between a compressed record and a
regular one is that the compressed record has a single-byte "this is the
record type and the time offset" field at the start.  That basically
avoids the need of then having a full 4-byte absolute time for such a
record.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-13 13:58:44 -07:00
Linus Torvalds
4aa70c9e2a garmin_parser: add a HRM profile message stub
This is an empty stub for the HRM profile message, which isn't actually
used by anything I know of, but came up as a result of some mis-parsing
of odd FIT files generated by the Suunto mobile app.

Losing synchronization in the FIT file then caused the parser to think
it needed this message type, and not having it then caused an early
abort.

While it's not actually needed once parsing things correctly, since I
looked up the message number and name for this message type, let's just
keep it around.  It won't hurt, and maybe it avoids me having to look it
up in the future.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-13 13:53:15 -07:00
Linus Torvalds
571df62ce5 garmin_parser: be a little less abrupt about parsing errors
Instead of returning an error on unrecognized input when parsing, just
skip to the end of the buffer.  This makes at least partially parsed
data available, which can help figure out what ended up happening.

This was part of my "Suunto also does FIT files now, and does them very
differently from Garmin" series.  I think I parse the Suunto files right
now, but next time this happens, I'd rather get partial data than no
data at all.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2023-07-13 13:49:00 -07:00
Michael Keller
1222041b46 HW OSTC3/4: Mark Inactive Gases as Such.
Return `DC_STATUS_UNSUPPORTED` for inactive gas mixes, while retaining
the configured gas information. This makes it possible to mark inactive
gases as such, or completely hide them, without affecting the gas
indices that are referenced in gas switches.

Signed-off-by: Michael Keller <github@ike.ch>
2023-07-09 14:46:44 +12:00
Linus Torvalds
3733b87ac9 Merge branches 'add_shearwater_teric_timesync' and 'add_ostc4_dump_error' of https://github.com/mikeller/libdc into Subsurface-DS9
Pull libdivecomputer updates from Michael Keller:

 - Add time synchronisation for the Shearwater Teric

 - Fix two OSTC4 buglets

* 'add_shearwater_teric_timesync' of https://github.com/mikeller/libdc:
  Add Time Synchronisation for the  Shearwater Teric.

* 'add_ostc4_dump_error' of https://github.com/mikeller/libdc:
  Fix bugs in OSTC4 support.
2023-07-08 16:50:45 -07:00
Michael Keller
b13ad617ac Fix bugs in OSTC4 support.
Fix two bugs in the support for OSTC4:
- change block size for writes back to 64 bytes to prevent buffer
  overflow on the dive computer side;
- added 'unsupported' response for the dump command on OSTC4.

Signed-off-by: Michael Keller <github@ike.ch>
2023-06-14 12:37:11 +12:00
Michael Keller
838717dbae Add Time Synchronisation for the Shearwater Teric.
Add time synchronisation support for the Shearwater Teric. Unlike the
other Shearwater dive computers this model has basic support for time
zones, so we need to set the time in UTC and configure the time zone
offset.

Signed-off-by: Michael Keller <github@ike.ch>
2023-06-08 22:25:26 +12:00
Linus Torvalds
436063c74d Merge tag 'v0.8.0' into Subsurface-DS9
Merge upstream version 0.8.0 into our libdc fork.

Since we tracked the development branch, we already had merged all the
main changes, but it's been a couple of months since the last upstream
merge, and there were a few new changes upstream:

 - Divesoft Freedom and Liberty support

 - A couple of iostream abstraction layers: a new 'packet layer' and a
   HDLC layer, moving code from low-level dive computer downloaders to
   generic iostream layers.

 - misc minor updates

* tag 'v0.8.0': (25 commits)
  Release version 0.8.0
  Fix the date of the v0.7.0 release
  Add a missing filter for the Aqualung i750TC
  Reduce the BLE output packet size to 20 bytes again
  Integrate the new packet I/O in the backends
  Add a generic packet I/O implementation
  Fix a typo in the documentation
  Add support for the Divesoft Freedom and Liberty
  Integrate the HDLC stream in the eonsteel backend
  Add a generic HDLC I/O implementation
  Remove the local endianess functions
  Use the correct function to free resources
  Add the udev rules to the distribution tarball
  Add a README file to the contrib directory
  Include the revision in the Visual Studio and Android builds
  Don't generate the Windows version resource
  Move the Visual Studio project to the contrib directory
  Add a basic Android build system
  Disable the getopt argument permutation on Android
  Move the sign extension function to a common place
  ...
2023-05-27 16:18:41 -07:00
Michael Keller
763fc68741 Shearwater: Add time synchronisation.
Add time synchronisation for Shearwater dive computers.
This synchronises the local time, which is all that is supported by all
Shearwater models except for the Teric.
Time synchronisation including the time zone for the Teric still has to
be added.

Signed-off-by: Michael Keller <github@ike.ch>
2023-05-20 19:25:20 +12:00
Jef Driesen
db9371cf9f Release version 0.8.0 2023-05-11 18:56:37 +02:00
Jef Driesen
49aa12b172 Fix the date of the v0.7.0 release 2023-05-11 16:27:55 +02:00
Jef Driesen
2f1b99f2f9 Add a missing filter for the Aqualung i750TC
Commit 58d410b1a217bbc1f03d5c7a5a203c139a92616c accidentally omitted the
descriptor filter function.
2023-05-11 16:26:40 +02:00
Jef Driesen
6c3bbb2cc7 Reduce the BLE output packet size to 20 bytes again
The newer u-Blox Nina B2 bluetooth module supports larger packets up to
244 bytes, but the older Telit/Stollman bluetooth module does not.
Trying to send a packet larger than 20 bytes fails. For maximum
compatibility, limit the output packet size to 20 bytes.
2023-05-11 16:25:59 +02:00
Jef Driesen
1c8cd096b5 Integrate the new packet I/O in the backends
Replace the custom packet handling code in the iconhd and ostc3 backends
with the new layered packet I/O, and also integrate it into the idive
and extreme backends.
2023-05-11 16:25:59 +02:00
Jef Driesen
40c95ca02a Add a generic packet I/O implementation
The new packet I/O provides a layered I/O for reading and writing a byte
stream from the underlying packet oriented transport.
2023-05-11 16:25:59 +02:00
Jef Driesen
72ddd6a439 Fix a typo in the documentation 2023-04-24 00:02:17 +02:00
Jef Driesen
d4472b758f Add support for the Divesoft Freedom and Liberty
The latest versions of the Divesoft Freedom (HW 4.x) and Liberty (HW
2.x) dive computers support BLE communication. Previous generations did
support only a mass storage mode, where the dives are available as DLF
files. The BLE communication protocol uses HDLC framing for the data
packets. The dives downloaded over BLE have the same data format as the
DLF files.

Co-authored-by: Jan Matoušek <jan.matousek@rekomando.cz>
Tested-by: Jakub Hečko <jakub.hecko@divesoft.com>
2023-04-24 00:02:17 +02:00
Jef Driesen
b0e77fd05f Integrate the HDLC stream in the eonsteel backend 2023-04-24 00:02:17 +02:00
Jef Driesen
cee9a2e926 Add a generic HDLC I/O implementation
The new HDLC I/O provides a generic I/O stream for reading and writing
HDLC encoded frames on top of another base I/O stream.
2023-04-24 00:02:17 +02:00
Jef Driesen
9c38ae3e01 Remove the local endianess functions
Replace the local functions for writing 16 and 32 bit little endian
values with the corresponding common functions.
2023-04-17 16:28:19 +02:00
Jef Driesen
629d567381 Use the correct function to free resources
Currently this doesn't make any difference because the
dc_device_allocate() function simply calls free(), but this may change
in the future.
2023-04-12 11:47:25 +02:00
Jef Driesen
bec4a747ff Add the udev rules to the distribution tarball 2023-04-07 20:37:19 +02:00
Jef Driesen
43f48af418 Add a README file to the contrib directory 2023-04-07 20:37:19 +02:00
Jef Driesen
e45c62b028 Include the revision in the Visual Studio and Android builds
During troubleshooting it's very convenient to know the exact version
used in a bug report. With the git commit SHA1 added to the version
string in all builds, that becomes very easy.
2023-04-07 20:37:17 +02:00
Jef Driesen
767a2fad91 Don't generate the Windows version resource
The Windows version resource is compiled and can include the (generated)
version.h header file for the definition of the version macros. There is
no need to have it generated by autotools. Less generated files makes it
easier to use other build systems, like Visual Studio.
2023-04-07 20:35:05 +02:00
Jef Driesen
083b1eb8de Move the Visual Studio project to the contrib directory
With this change all the alternative build systems are now located in
the contrib directory.
2023-04-07 20:35:05 +02:00
Jef Driesen
118f6d79ba Add a basic Android build system
Add a basic Android.mk for building with the Android NDK. This can serve
as a good starting point for developers integrating libdivecomputer into
an Android application.

Co-authored-by: Sven Knoch <info@divinglog.de>
2023-04-07 20:35:02 +02:00
Jef Driesen
cf221de9b7 Disable the getopt argument permutation on Android
On Android operating systems, the getopt() function is posix compliant
and thus the option processing stops when the first non-option is found.
But the getopt_long() function permutes the argument vector, just like
the GNU implementation.

Using a leading '+' character in the option string disables the
permutation again.
2023-04-07 14:04:00 +02:00
Dirk Hohndel
3a2dc6cce4 Adapt dctool to recent API change
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2023-03-29 11:24:43 -07:00
Jef Driesen
86fd58c8c6 Move the sign extension function to a common place 2023-03-23 19:43:16 +01:00
Jef Driesen
1930b9eb59 Merge branch 'checksums' 2023-03-23 19:41:11 +01:00
Jef Driesen
554855cc7d Add the 16-bit CRC-ANSI functions
Yet another family of 16-bit CRC function. The only difference with the
already available CRC-CCITT algorithm is the choice of the polynomial.
2023-03-23 19:31:01 +01:00
Jef Driesen
27b471e76b Document the properties of the CRC functions 2023-03-23 19:30:23 +01:00
Jef Driesen
00033e4af0 Rename the 32-bit CRC functions
The new names make it easier to identify the normal and reflected
variant of the CRC function.
2023-03-23 19:30:23 +01:00
Jef Driesen
d327aea6ff Add a reflected variant of the 16-bit CRC-CCITT
The reflected variant of a CRC does reverse the bits of each input byte
and requires a different lookup table for an efficient implementation.
2023-03-23 19:28:37 +01:00
Jef Driesen
12f44f3410 Add an extra parameter for the xorout value
This change allows to calculate some more variants of the CRC-CCITT
algorithm with a single function.
2023-03-23 19:28:24 +01:00