Commit graph

44 commits

Author SHA1 Message Date
Berthold Stoeger
f6e7bdc5ef Dive site: add dive site table parameter to dive site functions
To enable undo of dive site functions, it is crucial to work
with different dive site tables. Therefore add a dive site table
parameter to dive site functions. For now, always pass the global
dive site table. Thus, this commit shouldn't alter any functionality.

After this change, a simple search for dive_site_table reveals all
places where the global dive site table is accessed.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2019-04-12 18:19:07 +03:00
Berthold Stoeger
643a964d09 Cleanup: unconstify string argument to add_to_string()
add_to_string() frees the original string that is passed in. This
should therefore not be of "const char *" type, as the contents
of the string *will* be modified (or more precisely: destroyed).

Same for the congener smtk_concat_str().

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2019-03-27 13:58:15 +01:00
Berthold Stoeger
d1971a64f9 Core: Rename functions to more generic names
Rename
 - dive_get_insertion_index() -> dive_table_get_insertion_index()
 - unregister_dive_from_table() -> remove_from_dive_table()
 - get_idx_in_table() -> get_idx_in_dive_table()
 - sort_table() -> sort_dive_table()
This will make it more straight-forward to generate these functions
from macros.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2019-01-09 20:58:04 -08:00
Berthold Stoeger
724055f0af Dive site: replace dive->dive_site_uuid by dive_site
Replace the UUID reference of struct dive by a pointer to dive_site.
This commit is rather large in lines, but nevertheless quite simple
since most of the UUID->pointer work was done in previous commits.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-29 00:09:31 +00:00
Berthold Stoeger
d3a7c5448f Dive site: return pointer to dive_site in create_dive_site_*()
This changes more of the dive-site interface to return pointers
instead of UUIDs. Currently, most call sites directly extract
UUIDs afterwards. Ultimately, the UUIDs will be generally replaced
by pointers, which will then simplify these callers.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-29 00:09:31 +00:00
Berthold Stoeger
68961a169e Dive site: return pointer to dive_site in get_dive_site_*()
As a first step in removing dive-site uuids, change the interface
of the get_dive_site_*() functions to return pointers instead
of uuids. This makes code a bit more complicated in places where
the uuid is extracted afterwards (needed NULL check). Nevertheless,
these places should disappear once pointers instead of uuids are
stored in the dive-structures.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-29 00:09:31 +00:00
Linus Torvalds
28e3413ff6 Add 'location_t' data structure
Instead of having people treat latitude and longitude as separate
things, just add a 'location_t' data structure that contains both.

Almost all cases want to always act on them together.

This is really just prep-work for adding a few more locations that we
track: I want to add a entry/exit location to each dive (independent of
the dive site) because of how the Garmin Descent gives us the
information (and hopefully, some day, other dive computers too).

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2018-10-21 19:55:09 +03:00
Salvador Cuñat
5ebe4195e5 [smtk-import] Apply arrays to the main smartrak_import() function
Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-09-06 12:23:51 -07:00
Salvador Cuñat
4c9aeca0df [smtk-import] Remove now unused smtk-value-by-idx()
Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-09-06 12:23:51 -07:00
Salvador Cuñat
650b198715 [smtk-import] Apply arrays to parsing tables functions
And add a fuction to parse tables that are not "relational", meaning
tables which are directly refered from Dives table.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-09-06 12:23:51 -07:00
Salvador Cuñat
856848466a [smtk-import] Add a function to get the size of an array
We can allocate fixed size arrays for smartrak tables as its size can
be known in advance. Simply reading table->num_rows is too dangereous
as smartrak tables have "holes" commonly. This is, they can look like:
            Idx     |       Txt
             1      |       blablabla
             2      |       blebleble
             4      |       blobloblo
table->num_rows would give us 3, but we need to allocate 4 to get an
array like:

            |0|blablabla |1|blebleble |2|     |3|blobloblo

as the idea is to use the table index to reference the array data.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-09-06 12:23:51 -07:00
Salvador Cuñat
b87cbddfc1 smtk-import: Apply lists to main smartrak_import() function
Previously we built arrays for the tables each time we parsed a dive.
Now we simply build the lists once, and use them in each dive parsing.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-08-25 11:11:51 -07:00
Salvador Cuñat
272dcf9514 smtk-import: move from arrys to lists while parsing tables
In most cases we can not foresee the maximum number of data of a given
type. It can be quite low or really big (a concerned diver can store
thousands of different fishes in Fish table).
Moving from arrays, where size has to be preset, to linked lists seems
the more logical option.
Here we set a (very limited) data structure, just an index and a text
fields following the format of most SmartTrak tables. Some special
table, like Buddy, needs a bit of processing before placing the data in
the list.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2018-08-25 11:11:51 -07:00
Berthold Stoeger
360f07e453 Cleanup: pass gasmix by value
In a previous commit, the get_gasmix_* functions were changed to
return by value. For consistency, also pass gasmix by value.

Note that on common 64-bit platforms struct gasmix is the size
of a pointer [2 * 32 bit vs. 64 bit] and therefore uses the
same space on the stack. On 32-bit platforms, the stack use
is probably doubled, but in return a dereference is avoided.

Supporting arbitrary gas-mixes (H2, Ar, ...) will be such an
invasive change that going back to pointers is probably the
least of our worries.

This commit is a step in const-ifying input parameters (passing
by value is the ultimate way of signaling that the input parameter
will not be changed [unless there are references to said parameter]).

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-08-23 05:16:38 -07:00
Dirk Hohndel
d577467f97 Core: introduce new subsurface-string header
First small step to shrinking dive.h.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2018-05-14 10:13:39 -07:00
Berthold Stoeger
5c248d91cd Coding-style: remove superfluous parentheses
Mostly replace "return (expression);" by "return expression;" and one
case of "function((parameter))" by "function(parameter)".

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-02-17 19:38:52 -08:00
Berthold Stoeger
e85ecdd925 Introduce helper function empty_string()
There are ca. 50 constructs of the kind
  same_string(s, "")
to test for empty or null strings. Replace them by the new helper
function empty_string().

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-01-11 06:07:13 +01:00
Salvador Cuñat
bde73f05d4 smtk-import portability: avoid using %m[] in sscanf
As Lubomir pointed out in his patch for datatrak.c, the format option %m
for sscanf doesn't work in mingw/windows. Fortunately it's unnecessary
as dates are dropped and we just get times.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-06-11 13:50:59 -07:00
Salvador Cuñat
95ee579150 smtk-import: portability: rework non portable funcs
For different reasons some used functions aren't portable or simply are
not included in mingw. This includes index, rindex, strptime, and
timegm.

A workaround for this is needed, if we want to build for windows using
mingw based mxe environment.  This patch does:

- drops index and rindex in favor of strchr and strrchr
- substitute strptime with a sscanf parsing
- emulate timegm with a private func smtk_timegm()
- remove definitions needed by strptime

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-06-11 13:50:59 -07:00
Salvador Cuñat
b47d18b45a smtk-import: portability: rename DATE
DATE happens to be defined in wtypes.h. Redefining it may be a bad idea,
so move it to _DATE

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-06-11 13:50:59 -07:00
Salvador Cuñat
15c0a0a6ea smtk-import: portability: include windows.h
Include windows.h if we are cross building to windows

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-06-11 13:50:59 -07:00
Dirk Hohndel
b641757a0c Add SPDX header to smartrak importer
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-04-29 13:32:55 -07:00
Salvador Cuñat
441cfb3f05 smtk-import: Add curly braces in nested conditionals
Curly braces are necessary in nested conditionals or results may not be
those expected. In this case, the "else" clause applied on second "if",
instead of first one.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-04-21 06:52:13 -07:00
Salvador Cuñat
75007aa4ef smtk-import reuse pre-existent code and fix leak
Use update_event_name() for bookmarks merge and free temp string.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-04-21 06:52:13 -07:00
Salvador Cuñat
329a6bc075 smtk-import: Abort bookmark parsing if table doesn't open
Do not just report the failure but abort parsing or we will get a crash

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-04-21 06:52:13 -07:00
Salvador Cuñat
e4086dc746 smtk-import Avoid duplicities in bookmarks
SmartTrak's bookmarks work in the same fashion Subsurface's do. The user
may set a bookmark while underwater or set it just on the divelog
software.
At this time we are parsing those set in the DC twice, as we get one
from libdivecomputer and another from smarttrak's database.

This patch just checks if we have a bookmark event downloaded by
libdivecomputer which has the same time that the one parsed from the
.slg file. If so, merge the names taking the one from smarttrak.

Text from smarttrak is preferred because the user may have entered some
interesting note there and libdivecomputer's name is just "bookmark".

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-04-04 10:54:55 -07:00
Salvador Cuñat
4864ea56cb smtk-import Fix wreck data import
It was assumed that every data field in a wreck table was filled or
zeroed.  This assumption is actually false, so this patch adds testing
for the existence of strings before working with them.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-04-04 10:54:55 -07:00
Salvador Cuñat
e2fe196d82 smtk-import fix is_same_cylinder()
Add return value to the gasmix condition, and fix the rest of the
conditions.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
5c757d5c38 smtk-import - Change cylinder import logic
Until now, we did the cylinder import based on its initial pressure (a
tank without pressure is an unused tank). Based in this assumption, we
just dropped those tanks whose initial press was 0, losing user
introduced tank definitions  and getting some duplicities due to one
cylinder being numbered (e.g.) 2 by libdivecomputer and 3 by SmartTrak.

The new workflow is: get every single tank reported by SmartTrak (giving
preference to libdivecomputer parsed data), then clean the cylinder
table reverse order, dropping tanks without description and  init or end
pressures, and checkig them against the previous cylinder to do a merge,
if they look the same, and try to avoid duplicities.

The new logic assumes a heavier workload for the benefit of lower data
loss (e.g. a user may get his/her tanks descriptions despite he/she
hasn't recorded their pressures because forgot the values or had an issue
with the gas transmitter).

Suggested-by: Alessandro Volpi <volpial@gmail.com>
Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
16d37c254c smtk-import - Remove tank number limitation
In the past subsurface managed up to 8 tanks, but now it manages up to
20.  SmartTrak manages 10 (3 in older no trimix versions) so there is no
more need to drop the last tanks.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
20b348579b smtk-import rework smtk_build_tank_info()
The cylinder info is built one by one. This way, instead of passing dive
and tank number parameters, just passing a pointer to the tank been
worked seems preferable.

It also introduces lrint() in the function to round the doubles values
obtained from libmdb for tank size and workingpressure.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
36658d87f3 smtk-import - Add helper funcs to manage tank info
Framed in a full rework of the cylinders info import management, this
funcs will be used in next patches.

Functions merge_cylinder_type(), merge_cylinder_mix() and
merge_cylinder_info(), have been shamelessly copied from dive.c as they
have been removed by 162767aa dated 2017-03-11 just when I was going to
use them.

Macros MERGE_MAX() and MERGE_MIN() have just been copied from dive.c,
but they could be moved to dive.h so they could be used elsewhere if
needed.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
2cef8395b5 smtk-import Use lrint() when rounding to integer values
As commented on mailing list. Most numerical values from libmdb are
doubles obtained via strtod(), so, rounding them instead of just
truncating seems the correct way.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
9ddf2d2ad8 smtk-import Add smarttrak bookmarks parse capability
User can manually add bookmarks on the profile display of SmartTrak.
These are stored in a table with column names which made me think of
cartesian spatial coordinates. In the end the X coordinate is the time.
This makes possible to build subsurface events in those moments of the
dive. The other interesting data is just the text entered by the user.

Suggested-by: Alessandro Volpi <volpial@gmail.com>
Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
9073c3a860 smtk-import - Add function smtk_free()
Group some reiterative freeing task under the imaginative function name
of smtk_free().

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Salvador Cuñat
1413b910a2 smtk-import - Fix memory leaks
Fixes some memory leaks, most of them excesive use of copy_string() in
places where it was unnecesary.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-03-18 08:33:31 -07:00
Martin Měřinský
5fa64fd1ea SankTime > Sank Time 2017-03-04 12:08:17 -08:00
Salvador Cuñat
c2997c33c7 smtk-import: Fix freeing unallocated memory
hdr_buffer pointer was not always allocated (just on dc dives), but was
always freed.
This should cause a crash while processing a manually added dive (or a dive
whose dc model couldn't be stablished), but not always does, crashes only
if the pointed memory hasn't been previously allocated. In most cases causes
memory corruption, which goes easily unnoticed as it is correctly freed in
next parse run.
This means, obviously, I have some work TODO fixing leaks with valgrind.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-02-25 09:19:48 -08:00
Salvador Cuñat
8b2de77f91 smtk-import-change mktime with timegm
There were 1 or 2 hour differences between real dive time and the
imported time  because of the time zones and energy saving in some locales.
Using timegm() ensures us UTC times instead of localized times.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-02-10 20:30:58 -08:00
Salvador Cuñat
f7045c57cd smtk-import-improve smtk_time_to_secs()
Can't remember what I was thinking when wrote that crappy thing. A
simple sscanf call will do the job, and a sanity check, off course.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-02-10 20:30:58 -08:00
Salvador Cuñat
7c91cdd89e smtk-import-Fix crash due to localization issues
Libmdbº:xturns localized strings while parsing the data bases. This is
bad for time calculations as we may end with different strings formats
(e.g. en_US vs almost the rest of the world). Solution is simple: set a
fixed locale and parse only this format.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-02-10 20:30:58 -08:00
Dirk Hohndel
22267762ce Smart Trak tool compile fix
In commit 70e2404492 ("Stop accessing the internals of
dc_descriptor_t") the structure definition of the libdivecomputer
descriptor was removed from Subsurface and replaced with accessor
functions. This adapts the Smart Trakl import tool to use the same
accessor functions, which allows it to compile again in current master.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-01-17 09:57:40 -08:00
Salvador Cuñat
a71224b350 Locate included header files
After commit 7be962b some directories changed their names.

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
2017-01-05 13:14:17 -08:00
Salvador Cuñat
dc4d8f26ec SmartTrak import - Support for .slg files import
SmartTrak is a Windows based propietary dive log software by Uwatec, which has
been the reference software for every Scubapro/Uwatec IRda based devices,
ranging from Smart to Galileo. It has just been recently that began to be
substituted by newer softwares like LogTrak and JTrak (these only supports
Galileo or newer devices and don't import SmartTrak's .slg files).i

SmartTrak also supports importing dives from older DataTrak software (oldest
Aladin series, serial based DCs) so most divers using Scubapro/Uwatec products
have probably their dives registered in this log, even those who have just moved
to newest Scubapro/Uwatec DCs.

SmartTrak is based in MS Access database with support for recreational and
technical dives up to 10 tanks, trimix (in later versions, prior versions had
support for just 3 tanks with Nitrox) and SCR/CCR.

In Linux, MsAccess databases are supported via libmdb which in turn depends on
libglib2, so this work has a hard dependency on these two libraries.
Libmdb sees very little (or null) development activity today so it can be
considered a mature library, which, in my opinion, makes it independent of
progresses of libglib2, this way, the tool should build on most Linux
distributions, even oldest ones (well, this will actually be false because of
the other dependencies of Subsurface).

Final note: It hasn't been until very recently that libdivecomputer has included
support for some of the data downloaded from Galileo devices, even today
understanding some of these data is WIP (e.g. alarms, are interpreted as
bookmarks at this moment, and there is a lot of noise coming from the
tanks/gases area in libdc)

Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-11-12 07:39:10 -08:00