summaryrefslogtreecommitdiffstats
path: root/core
AgeCommit message (Collapse)Author
2020-09-29filter: unify desktop and mobile filtersGravatar Berthold Stoeger
Switch the mobile code to use the constraint-based filter. The one thing that is still commented out is dive-site mode, since mobile doesn't (yet) have a dive-site edit feature. And even if it had, the dive list probably wouldn't be shown at the same time. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29filter: connect new filtercode to filterwidget2Gravatar Berthold Stoeger
Replace the static filterwidget with a list of filterconstraints. The first attempt of using a table widget failed, because Qt's table delegates are dysfunctional. It's not that they are bad, they just don't work at all. Therefore, this code "simulates" a table in that on addition / deletion of constraints it keeps track of the rows of all constraints so that each constraint-widget can be associated with a row of the constraint model. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29filter: add filter constraint modelGravatar Berthold Stoeger
Add a model that keeps track of a list of filter constraint and makes them accessible from Qt. Sadly, this is mostly repetitive boiler-plate code, but this is due to Qt's model/view-API, which is a perfect example of how *not* to design a reasonable modern API. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29filter: add filter constraint object to the coreGravatar Berthold Stoeger
Adds a filter constraint object to the core, which represents one constraint the user can filter dives with. The plan is to write these constraints to the XML and git logs. Therefore, this code is written in C-style except when it comes to handling strings and dates, which is just too painful in plain C. There is one pointer to QStringList in the class, though when compiled with C, this is simply transformed into a pointer to void. Granted, that smells of an ugly hack. However it's more pragmatic than self-flaggelation with C string and list handling. A filter constraint is supposed to be a very general thing, which can filter for strings, multiple-choice lists, numerical ranges and date ranges. Range constraints have a range mode: less-or-equal, greater-or-equal or in-range. Text constraints have a string mode: startswith, substring or exact. All the data are accessed via setter and getter functions for at least basic levels of isolation, despite being written with a C-interface in mind. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29fulltext: remember original queryGravatar Berthold Stoeger
So far, the fulltext-query structure only saves an canonicalized upper-cased version of the query. However, if we want to save the fulltext query to the log (filter presets) or want to restore an old fulltext query, we have to store the original query. We don't want to confront the user with the mangled upper-cased version. Therefore, also save the original version. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29core: add functions to core/time.cGravatar Berthold Stoeger
To support the new filter code, add helper functions that turn timestamps into year and day-of-week to core/time.c. Internally, these functions simply call utc_mktime() to break down the timestamp and then extract the wanted value. This may appear inefficient, but testing shows that modern compilers are quite effective in throwing away the unneeded calculations. FWIW in this respect clang10 outperformed gcc10. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-29Use correct pO2 when computing MOD in equipment tabGravatar Robert C. Helling
The cylinder model is used both in the planner and the equipment tab. We have three preferences for the pO2 that is used to compute MOD: In the planner, there is one for the bottom part of the dive and another one for deco. Those are set in the planenr UI. There is another value, controlled in the Tec Prefernces. That one should be used in the equipment tab rather than the one from the planner. Fixes #2984 Signed-off-by: Robert C. Helling <helling@atdotde.de>
2020-09-29Prefer "GPS1" for divecomputer download dive site resolutionGravatar Linus Torvalds
I think we only have one dive computer that supports GPS data right now: the Garmin Descent Mk1. It reports the dive coordinates as "GPS1" and "GPS2" for the entry point and exit point respectively. Often GPS1 is missing, because the dive computer may not have gotten a GPS lock before the diver jumped into the water, so when that happens we'll use GPS2 for the dive site location. But when GPS1 exists, we should prefer that. And that's what we already did in logic in dc_get_gps_location(), but for the initial dive site created at download time, we just picked any divecomputer reported string that started with "GPS". And since GPS2 is reported after GPS1 by the Garmin Descent, it would end up overwriting the entry point that we _should_ have preferred. Add the same kind of "explicitly prefer GPS1" logic to the initial dive download case as we already had elsewhere. Reported-by: @brysconsulting Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-09-29gps: remove unused member functionGravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-22cleanup: silence two compiler warnings in git-access.cGravatar Berthold Stoeger
gcc complained about two constructs of the kind remote_id && SSRF_INFO("..."); And while I am not a fan of excessive warnings, I must say it has a point here. That's just code obfuscation. In fact, it appears that the condition was wrong - the SSRF_INFO should probably be invoked if remote_id is NULL. The way it was written it would be invoked if it was *not* NULL. Change both instances to unfancy if statements. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-21translations: initialize water type strings at run timeGravatar Berthold Stoeger
The water type strings were static and therefore passed through gettextFromC::tr() before main(). One would hope to get a warning in such a case, but this is not the case. Therefore, use the QT_TRANSLATE_NOOP macro to register the strings in Qt's translation system and translate the list when needed. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-21Bailout segment is part of bottom timeGravatar Robert C. Helling
The clock is only valid in ascent. In each cycle of the 'critial volume algorithm' it re-initialized to the bottom time at the beginning of deco. So the time spent on bailout should be added to this bottom time. Thanks to Coverty for spotting this. Coverity-scan: CID-362079 Signed-off-by: Robert C. Helling <helling@atdotde.de>
2020-09-20selection: when changing current dive make sure it is selectedGravatar Berthold Stoeger
When an undo command selected invisible dives, a current dive outside of the list of selected dives was chosen. This could have the very unfortunate effect that the current dive was set, though not selected. From an UI point of view this meant that the dive was displayed, but edits would not be registered. Change the setClosestCurrentDive function to select the current dive. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-19core/bluetooth: only Linux / Windows are supported by libdc rfcommGravatar Dirk Hohndel
For Android the Qt Bluetooth code seems to work just fine. And for macOS nothing appears to work right now, but at least the Qt implementation compiles and links. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-19core/bluetooth: switch to use libdivecomputer rfcomm supportGravatar Linus Torvalds
The Qt based implementation apparently got broken at some point and now fails to connect to rfcomm dive computers like the Shearwater Petrel. This uses the libdivecomputer rfcomm backend. Tested to work with bluez on Linux as well as with the native Windows implementation. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-19Update Shearwater sample time calculationGravatar Miika Turkia
At least Shearwater Cloud seems to use multiple formats for sample time recorded in the database. Sometimes the time is in seconds, sometimes in milliseconds, and sometime it is something I have no idea about. Thus switching to calculating the sample id myself and using sample interval to calculate the actual sample time. Seems to be more reliable than trying to guess what format Shearwater is using for this specific dive. Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-19media: read timestamp from mvhd header of MP4/QuickTime videosGravatar Berthold Stoeger
ExifTools (and probably other meta-data editors) modifies the mvhd creation date, but leaves the individual creation dates in the tracks unchanged. Therefore, use the mvhd atom. Reported-by: Eric Tanguy <erictanguy2@orange.fr> Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-17Extend BLE uuid matching to the characteristics, add ignore-listGravatar Linus Torvalds
This extends the uuid matching to the low-level characteristics too, so that we can ignore the McLean Extreme characteristics that aren't interesting. It also renames the uuid matching to be about a "uuid_list" rather than being about the service we're matching, since we're now using it for other uuid's than just services. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-09-17Fix 'uud' typo in BLE uuid matching codeGravatar Linus Torvalds
Silly typo with a missing 'i' in 'uuid' that happened when I wrote this code originally, and that compiled fine thanks to the error being duplicated with cut-and-paste to all relevant places. Fix it now, since I'll extend the uuid matching to the actual characteristics for the McLean Extreme. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-09-15translations: use the right Qt translations (part 2)Gravatar Dirk Hohndel
It turns out that contrary to what the documentation states, a few languages are still only using the 'qt' translation. But those exist for all languages, so we need to first search for the 'qtbase' translations, and only if that fails do we try to load the 'qt' translations. And even that will fail for languages in which Qt simply isn't localized (like Dutch). To make the code more readable, the check for 'US English' was moved earlier as there is no point to look for a Qt translation for that (simply doesn't exist). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-15translations: use the right Qt translations and try harder to find themGravatar Dirk Hohndel
We were still using the 'qt' translations instead of 'qtbase' as we should have been using since forever - it's a little unclear from reading the documentation when in the Qt5 life cycle this happened, but definitely several years ago. These are the strings used in situations where Qt already provides us with text (e.g., the entries in the 'Subsurface' menu on Mac, or the button labels in many dialogs). Additionally we didn't try hard enough to find those translations in cases where they are bundled with the app; so basically all scenarios except for Linux distro specific packages or 'build from source' on macOS or Linux were not going to work, even after addressing the qt->qtbase conversion. But of course the developers pretty much all fall into those last two categories. Still, I cannot believe we never fixed this in all those years... To make it more obvious if we still aren't finding the Qt translations this commit also makes that warning be shown in all cases, not just when running in verbose mode. Fixes #2954 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2020-09-15Grab the first gas on Shearwater importGravatar Miika Turkia
The logic to retrieve gas changes from Shearwater cloud database is detecting only when the O2/He chnages. This change will grab the initial gas. (Problem was only shown when there was a gas changee in the log, so cingle cylinder dives were working fine.) Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-15Fix a bug on Shearwater cloud gas changesGravatar Miika Turkia
Gas change is done to the cylinder we just found and not the last cylinder. Also switching the variable name to index as we are actually using that value outside the loop. Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-15Import cylinder pressure correctlyGravatar Miika Turkia
Shearwater apparently stores correct pressures nowadays, so getting rid of a hack to import double pressures. Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-15Ignore gas changes if we one line contains bogus O2Gravatar Miika Turkia
This will ignore the gas changes that would be caused by Shearwater cloud saving rows with 0 values in them. Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-15New field for timestamp in shearwater cloud DBGravatar Miika Turkia
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-15Shearwater cloud import: ignore bogus rowsGravatar Miika Turkia
A sample log I received contains a lot of rows with 0 values in it. This will ignore the obviously bogus ones. (However, we might miss the first sample if that is recorded at time 0.) Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2020-09-13cleanup: fold core/divecomputer.cpp into core/device.cGravatar Berthold Stoeger
core/device.h was declaring a number of functions that were related to divecomputers (dcs): creating a fake dc for manually entered dives and registering / accessing dc nicknames. On could argue whether these should be lumped together, but it is what it is. However, part of that was implemented in C++/Qt code in a separate core/divecomputer.cpp file. Some function therein where only accessible to C++ and declared in core/divecomputer.h. All in all, a big mess. Let's simply combine the files and conditionally compile the C++-only functions depending on the __cplusplus define. Yes, that means turning device.c into device.cpp. A brave soul might turn the C++/Qt code into C code if they whish later on. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-13cleanup: remove unused declarations in class DiveComputerListGravatar Berthold Stoeger
The functions matchDC() and matchModel() were never implemented. Remove their declarations. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-13cleanup: remove unused function DiveComputerNode::changesValues()Gravatar Berthold Stoeger
This was not used anywhere - let's remove it! Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-13cleanup: move set_dc_nickname() declaration from dive.h to device.hGravatar Berthold Stoeger
The function *looks* like it is a dive function. However, in reality it implicitly works on the global device list. Therefore, it is thematically more aptly located in device.h with the other device functions. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-13Disable SAC factor setting for CCR divesGravatar Robert C. Helling
The SAC factor is only used for minimal gas calculations which don't make sense in the CCR context. Additionally, make bailout stop for at least minimum switch time or problem solving time. Signed-off-by: Robert C. Helling <helling@atdotde.de>
2020-09-12desktop: refine auto-fill of weightsGravatar Berthold Stoeger
In a previous commit, auto-filling of weight based on type was changed to be only performed if the user hadn't already set a weight, by testing for weight=0. However, when the user edited the type and tabbed back and forth, that counted as an edit and therefore the weight would not change anymore. To refine this, introduce an "auto_filled" flag to the weightsystem, which is set if the weight is automatically filled and cleared if the weight is edited. Update the weight if it was zero *or* auto-filled. The flag is not saved to disk, but that should be acceptable. If the user saves and reloads, we can assume that they meant the weight to be set to the default value. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-08cleanup: remove invalidate_dive_cache() call in clone_delete_divecomputer()Gravatar Berthold Stoeger
The function was called on a freshly copied dive, which has its git cache invalidated automatically in copy_dive(). Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-08cleanup: remove dead code from delete_divecomputer()Gravatar Berthold Stoeger
delete_divecomputer had legacy code, which 1) invalidated the git dive cache 2) made sure that the dive computer was not displayed anymore However, both callers called on a freshly copied dive, which has its dive cache invalidated in copy_dive() and can't be the currently displayed dive. Therefore, this code is dead code and can be removed. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-08cleanup: remove count_divecomputers() functionGravatar Berthold Stoeger
There is a number_of_computers() function which does the same thing with two exceptions: 1) checks for null-dive 2) returns an unsigned int Replace calls to count_divecomputers() by calls to number_of_computers(). In one case, the return type makes a different - add a cast to int there. Ultimately, we should probably change the dc_number to signed int throughout the code. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: make taxonomy_index_for_category() local to taxonomy.cGravatar Berthold Stoeger
This helper function is not used outside taxonomy.c anymore. Let's hide this implementation detail. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: use taxonomy_get_value() instead of taxonomy_get_index()Gravatar Berthold Stoeger
Instead of getting the index and using that to access values, use the taxonomy_get_value() helper function. Two places are affected: 1) reverse geo-lookup 2) location filter delegate The behavior of reverse geo-lookup is changed slightly: now an empty string is likewise recognized as missing "TC_ADMIN_L3". Before, only a missing category was interpreted as such. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: create taxonomy_get_value() functionGravatar Berthold Stoeger
This is the counter-part to taxonomy_set_value(). Let taxonomy_get_country() be the first user of the function. If a category doesn't exist, return NULL. Small addition: make taxonomy_get_countr() take a const argument. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: use taxonomy_get_country() in get_dive_country()Gravatar Berthold Stoeger
get_dive_country() was essentially a reimplementation of taxonomy_get_country(). Let's just use the already existing function. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: use taxonomy_index_for_category() in taxonomy_set_category()Gravatar Berthold Stoeger
Instead of recoding the "search for category" loop, reuse the already existing functionality. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: make alloc_taxonomy local to taxonomy.cGravatar Berthold Stoeger
The alloc_taxonomy()/free_taxonomy() interface was exceedingly strange. The former gave a "struct taxonomy", the latter took a "struct taxonomy_data". To make things worse, is appears as if the names "taxonomy" and "taxonoma_data" are reversed: the latter contains the former. In any case, the alloc_taxonomy() call is not needed anymore from outside taxonomy.c, as these memory-management details are now hidden in accessor functions. Therefore, make the function local to taxonomy.c. Moreover, rename it to "alloc_taxonomy_table()" and let it take a "taxonomy_data" structure for symmetry with "free_taxonomy()". Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: use taxonomy_set_category() functionGravatar Berthold Stoeger
Instead of manipulating the taxonomy structures directly, use the taxonomy_set_category() function. This improves encapsulation and gives us the possibility to improve the taxonomy data structures. This concerns three places: 1) git parser 2) XML parser 3) reverse geo-lookup This improves the XML parser code slightly: The parser assumes that the value-attribute comes last (after origin and category). While it still does that, it now at least generates a warning if it encounters a value-attribute without origin- or category-attribute. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: copy string in taxonomy_set_[country|category]Gravatar Berthold Stoeger
These functions were taking a const char *, yet taking ownership of the value. Moreover, taking ownership of strings is rather unusual in C-style APIs. Let's copy the string instead. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: add helper function to set taxonomy categoryGravatar Berthold Stoeger
Setting a taxonomy category was cumbersome: the caller had to make sure that the category-table was allocated. Introduce a helper function to make that simpler. Make taxonomy_set_country() the first caller of the new function, since it is just a special case with category = TC_COUNTRY. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06cleanup: leak fix in taxonomy_set_country()Gravatar Berthold Stoeger
When overwriting a country, the old string was not freed. Fix this. Contains an unrelated coding-style fix: use braces if code block contains more than one line. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2020-09-06Function for "gravity conversion"Gravatar Robert C. Helling
This adds a common macro to convert salinity (which is given as a density in terms of g per 10l) to a specific weight with units of mbar / mm = bar / m that is used to translate between pressures and depths. The weired factor of 10 (from the unusual unit of salinity) is included in the macro. It is there for historical reasons, as it goes back to 05b55542c8 from 2012 where it was introduced in code for downloading from Uemis dive computers. Now, salinity appears in too many places to easily remove this unconventional factor of 10 everywhere without breaking to many things (including various dive computer downloads). Signed-off-by: Robert C. Helling <helling@atdotde.de>
2020-09-05[Bug #2934] Geo Lookup - support for remote dive sitesGravatar Michael Werle
Some remote dive sites have no populated places (towns, cities) nearby. For such sites, we now fall back to looking up unpopulated place names, such as the reef or island name. Also some code refactorisation: the actual network access is now encapsulated in its own function removing some duplicated code handling in the reverseGeoLookup function and making it more readable. Furthermore, reverseGeoLookup() was completely refactored as most of its functionality was due to legacy requirements; the current code-base only calls this function from a single location and only with an empty taxonomy_data object. This makes the function more focussed and much simpler and more readable. Finally, a resource leak in reverseGeocde introduced in 4f3b26f9b6296273e37ec317bc68f32f94f546dc was fixed. Signed-off-by: Michael Werle <micha@michaelwerle.com>
2020-09-04Implement Seac SeacSync databaser parser.Gravatar James Wobser
Dives for the seac action computer are imported by the seacsync program into two tables in an sqlite3 database. The dive information is read from the headers_dive table. The dive_data table is then queried for each dive to get samples. The seac action computer is the only current supported computer by the seacsync program. It only supports two gas mixes, so the parser will toggle between two cylinders whenever it detects a change in the active O2 mix. Dive start time is stored in UTC with a timezone offset. A helper function to read this was added to qthelper. Default cases have been added to some switch statements to assist in future development for other dive types and salinity. Example database has been added to ./dives/TestDiveSeacSync.db Signed-off-by: James Wobser <james.wobser@gmail.com>
2020-09-03datatrak.c: return const string for tank typeGravatar Salvador Cuñat
As Berthold points out, this string shouldn't be modifiable. Signed-off-by: Salvador Cuñat <salvador.cunat@gmail.com>