aboutsummaryrefslogtreecommitdiffstats
path: root/core
AgeCommit message (Collapse)Author
2018-12-23Bluetooth: all states other than HostPoweredOff qualify as validGravatar Jan Mulder
This is an attempt to fix issue #1896. While this seems a Qt issue in combination with very specific Android devices, this might be a fix. Do not check for a very specific state of the local BT controller, but just check if it is powered on. Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
2018-12-23Cleanup: remove unused parameter was_autogenGravatar Berthold Stoeger
In commit 6bf4120dbbf7be1b9267e0e86f3948b77870ea71 the trip-flags were replaced by a simple boolean. This made the was_autogen parameter to the remove_dive_from_trip() and unregister_dive_from_trip() functions unused. Remove these parameters. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-21core: recognize Oceanic Pro Plus X over BLEGravatar Dirk Hohndel
Just like with the Aqualung i770R in 7697003498 this name follows the pattern of a model number in ASCII encoding, followed by the serial number of the device. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2018-12-17Import: unglobalize downloadTableGravatar Berthold Stoeger
To make data flow more clear, unglobalize the downloadTable object. Make it a subobject of DownloadThread. The difficult part was making this compatible with QML, because somehow the pointer to the download-table has to be passed to the DiveImportedModel. Desktop would simply pass it to the constructor. But with objects generated in QML this is not possible. Instead, pass the table in the repopulate() function. This seems to make sense, but for this to work, we have to declare pointer-to-dive-table as a Q_METATYPE. And this only works if we use a typedef, because MOC removes the "struct" from "struct dive_table". This leads to compilation errors, because dive_table is the symbol-name of the global dive table! Sigh. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-17Cleanup: make DCDeviceData a "normal" singletonGravatar Berthold Stoeger
DCDeviceData was using that weird pattern where the instance variable was set in the constructor. There is no apparent reason to do so, therefore convert to a "normal" singleton. Access that directly in QMLManager instead of saving it in a member variable first. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-17Core: remove count_dives_with_*() functionsGravatar Berthold Stoeger
The simplified filter-widget doesn't present lists of existing values with counts. Thus, a whole slew of count_dives_with_*() functions can be removed. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-17Show average max depth in yearly statisticsGravatar Robert C. Helling
this was requested in #1854 and I think this suggestion makes sense Fixes #1854 Signed-off-by: Robert C. Helling <helling@atdotde.de>
2018-12-14Cleanup: detangle unregister_dive() and delete_single_dive()Gravatar Berthold Stoeger
These two functions were called in different contexts: - unregister_dive(): from the undo-commands to remove the dive from the global dive table, but not delete it. The dive was already removed from its trip. - delete_single_dive(): from non-undo code. Most of it not in use and removed in a sibling-commit. Here, the dive is supposed to be removed from its trip and a new selection is calculated. delete_single_dive() calls unregister_dive(), which removes the dive from its trip. Move remove_dive_from_trip() from the former to the latter and make both functions independent. Instead of deleting the dive explicitly in delete_single_dive(), call the delete_dive_from_table() function. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-14Core: don't remove dive from trip in add_dive_to_trip()Gravatar Berthold Stoeger
All callers of add_dive_to_trip() work on freshly generated dives, with one exception, that was redundant anyway. Therefore it is not necessary to remove the dive from a potential previous trip. Move the responsibility of removing the dive from a trip to the caller, respectively remove the redundant call. Add a warning message in the case that trip is set. Background: On import (either download or file-import) we might not want to add trips to the global trip-list. For example to enable undo of import but more generally to detangle that data flow. Thus, add_dive_to_trip() should not mingle with the global trip-list, which it has to do if a trip is deleted because the old dive was removed. Analysis of the add_dive_to_trip() callers: 1) core/dive.c pick_trip(): called on freshly generated merged dive. finish_split(): called on two freshly generated split dives. 2) core/divelist.c create_and_hookup_trip_from_dive(): called on freshly downloaded dive in dive_cb(). called on freshly downloaded dive in record_uemis_dive(). autogroup_dives(): called on dive from get_dives_to_autogroup(), which only finds dives that are outside of trips. combine_trips(): unused - removed in sibling commit. try_to_merge_into(): this call was actually erroneous - dive was already added to trip in try_to_merge(). Remove call. 3) core/libdivecomputer.c dive_cb(): called on freshly downloaded dive. 4) core/uemis_downloader.c record_uemis_dive(): called on freshly downloaded dive. 5) core/load_git.c create_new_dive(): called on freshly allocated dive. 6) core/parse.c dive_end(): called on freshly parsed dive. 7) desktop-widgets/command_divelist.cpp DiveListBase::addDive(): called on dive which is newly added to core. moveDiveToTrip(): called on dive that was removed from trip a few lines above. 8) mobile-widgets/qmlmanager.cpp QMLManager::undoDelete(): called on dive where divetrip was reset in the previous line. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-14Cleanup: remove split_dive_*() functionsGravatar Berthold Stoeger
In 302f6adb79681da3fe53336f1e4c7525f46fd47d dive-splitting was made undo-able. To this goal, the dive-splitting functions were split in two types: Those that operate directly on the divelist and those that only allocate the dives. The former are not in use anymore, therefore remove them. Since only the latter remain, remove the "_dont_insert" appendix of the name. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-14Cleanup: remove merge_two_dives() functionGravatar Berthold Stoeger
In 014c04f8bd30740e7711f3b3a01619fd27b5b613 merging dives was included in the undo-system. This made the merge_two_dives() function caller-less. Remove it. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-14Cleanup: remove remove_autogen_trips() functionGravatar Berthold Stoeger
In f427226b3b605523bc8285dbdaaa7f6993af6e6a autogrouping / removal of autogrouping was moved into the undo-machinery. This made the remove_autogen_trips() function caller-less. Remove it. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-14Cleanup: remove combine_trips() functionGravatar Berthold Stoeger
In f427226b3b605523bc8285dbdaaa7f6993af6e6a a combine_trips_create() function was introduced that combined trips without deleting the old trips. This was necessary for making combine-trips function undo-able. The old combine_trips() function is not used anymore. Therefore remove it. Rename the combine_trips_create() function to combine_trips() as no differentiation is needed anymore. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-12-13Dive media: add media to closest diveGravatar Berthold Stoeger
Currently, when selecting "Load media files even if time does not match the dive time", the media are added to *all* selected dives. Instead add it to the closest dive. This seems like the less surprising behavior. Of course now if the user really wants to add a media file to multiple dives, they will have to do it manually. To avoid a messy interface, this is solved by moving the iterate- over-selected-dives loop to the core. Thus, a helper-function can be made local to its translation unit. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-24Cleanup: remove EMPTY_DIVE_STRINGGravatar Berthold Stoeger
EMPTY_DIVE_STRING used to be a string-literal representing missing information ("--"). In 6985c123d412d3223618247e2fcc733cd99bb842 it was replaced by the actual empty string. Using a literal to represent the empty string seems a bit pointless, therefore remove it completely. Notably: QString(EMPTY_DIVE_STRING) -> QString() if (temp.isEmpty()) temp = EMPTY_DIVE_STRING; -> noop if (s == EMPTY_DIVE_STRING) -> if (s.isEmpty()) Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Cleanup: remove redundant 'extern "C"' in dive.hGravatar Berthold Stoeger
In dive.h there was a redundant 'extern "C"' block defined inside another 'extern "C"' block. Remove. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Filter: use hidden_by_filter also on mobileGravatar Berthold Stoeger
Desktop used the hidden_in_filter flag in struct dive, mobile used its own vector plus a new showndives member in struct dive_trip. Unifiy these to use the same core-facility, viz. hidden_by_filter. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Core: move is-single-day-trip and count-shown functions into coreGravatar Berthold Stoeger
These functionality was used by the desktop filter. To unify desktop and mobile, move it into two new functions in divelist.c Since one of them is the only caller of is_same_day() move that likewise into divelist.c and make it of static linkage. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Mobile: don't format trip heading for all divesGravatar Berthold Stoeger
QML's ListView uses the "section" property to test if items belong to the same section. Apparently, this must be a string and therefore we can't pass e.g. a dive-trip object. Therefore a specially formatted string was passed in, which was guaranteed to be unique (contained the dive-trip pointer value) and the fully formatted trip-title and short-date. The disadvantage of that approach is that the formatting is performed for every dive and not every trip. Perhaps not a problem now, but it makes it for example necessary to cache the number of filtered dives. To be more flexible, pass in only the pointer value formatted as hexadecimal string and provide a function to convert that string back to a trip-pointer (in the form of a QVariant, so that it can be passed to QML). Moreover provide two functions for formatting the title and the short-date. The three new functions are members of DiveListSortModel. This might not be the perfect place, but it is easy to reach from the DiveListView. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Cleanup: remove DiveObjectHelper::trip() functionGravatar Berthold Stoeger
The DiveObjectHelper::trip() function was 1) Misnamed: it returned the *location* of the trip 2) Not used outside of DiveObjectHelper Remove it. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-23Cleanup: make "struct dive *" and "struct dive_trip *" Qt metatypesGravatar Berthold Stoeger
Just as we did for pointer to struct dive_site, make pointers to struct dive and struct dive_trip "Qt metatypes". This means that they can be passed through QVariants without taking a detour via void *. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-22Improve OTU calculationsGravatar willemferguson
Implement the protocol in Erik Baker's document "Oxygen Toxicity Calculations". This code uses a third-order polynomial approximation of Baker's equation 2. Provision is made for PSCR and CCR dive logs and dive plans. In the case of dive logs, the values of o2 sensors are used if there are data from such sensors. For CCR only the data from the first O2 sensor is used even if there are more than one sensor. This is a potential weakness, but this function is probably NOT the place to calculate mean o2 values accross all sensors and to emulate voting logic to reject info from aberrant sensors. Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za> Signed-off-by: Robert C. Helling <helling@atdotde.de>
2018-11-21Git parser: don't produce user-visible error on git parsingGravatar Berthold Stoeger
In 64e6e435f82801f4f440ef5b1caf58a91a7c9929 the when field of struct trip was removed. Accordingly it was not read from git repositories. This produced a large amount of user-visible error messages. Reinstate the trip-date and time parsing functions, but ignore the value. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-21Core: fix crash concerning removal of dives from tripsGravatar Berthold Stoeger
Commit 6b283e598a3a08c6133d66b5d5617370296e7d0e replaced the linked list of dives in a trip by a table. Embarassingly, on dive deletion the index of the dive in the table was compared for "!= 0" instead of ">= 0". Thus, the first dive of a trip wouldn't be deleted, which ultimately led to a crash, as different parts of the code were now in disagreement over whether the trip is empty or not. Fix the comparison. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-20Core: replace tripflag by notrip booleanGravatar Berthold Stoeger
The only remaining use of the tripflag was to mark dives that were removed explicitly from a trip, i.e. shouldn't be autogrouped. Therefore replace the enum by a simple boolean. Currently, there is no way of unsetting the notrip flag. But this shouldn't result in a user-visible change. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-20Core: remove ASSIGNED_TRIP trip flagGravatar Berthold Stoeger
The distinction between ASSIGNED_TRIP and IN_TRIP was used to prefer non-autogenerated trips on merging of dives. But owing to bit rot this seem to have worked only partially anyway: The IN_TRIP field was set in create_and_hookup_trip_from_dive() and immediately overwritten in add_dive_to_trip() called in the next line. Instead, use the trip->autogen flag to check for priority and remove the ASSIGNED_TRIP flag alltogether. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-20Core: remove two unused macrosGravatar Berthold Stoeger
The UNGROUPED_DIVE and DIVE_IN_TRIP were never used. Remove them. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-19Uemis downloader: free ans_path on errorGravatar Berthold Stoeger
In a few instances, the ans_path was not freed on error. Fix them. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-19Warnings: silence new gcc warnings in uemis-downloader.cGravatar Berthold Stoeger
Since upgrading to gcc 8.2 it produces noisy warnings about potentially truncated strings. It doesn't recognize that filenr can never become >4000. So clamp it down explicitly. Do this by adding a function that does the assembly of the filename path. Adding unnecessary code to silence compiler warnings is dubious, but in this case it might be reasonable. Fix a second instance by increasing the stack-allocated buffer to 32 bytes. Hopefully nobody has more divespots than would fit in a 9-decimal digit number! Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Parser: add dive to trip at end of dive-parsingGravatar Berthold Stoeger
When adding the dive to its trip before having filled out "when", the dive gets added at the first position (when=0), which is usually not correct. Instead, add the dive to its trip when all fields are correctly filled out. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Core: remove "when" field of struct dive_tripGravatar Berthold Stoeger
The when field gives the time of the first dive. Instead of keeping this field in sync, replace it by a function that determines the time of the first dive. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Dive list: move sort-functionality into coreGravatar Berthold Stoeger
To make sorting more controlled, move all sorting functions into the core. For this, introduce a "dive_or_trip" structure, which represents a top-level item. Adapt the DiveTripModel accordingly. There are now three sorting functions: 1) dive_less_than 2) trip_less_than 3) dive_or_trip_less_than These should be used by all sorting code. By moving them to a single place, the mess can hopefully be cleaned up. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Dive list: implement trip_less_than functionGravatar Berthold Stoeger
As a step towards proper sorting, introduce a trip_less_than() function in core. It simply sorts by the first dive, which should be unique as dives may belong to only one trip. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Dive list: replace dive-list of trips by a tableGravatar Berthold Stoeger
The dives of each trip were kept in a list. Replace this by a struct dive_table. This will make it significantly easier to keep the dives of a trip in sorted state. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Core: add add_dive_to_table() functionGravatar Berthold Stoeger
Up to now, dives were added to the global dive table with add_single_dive(). Split out the funtionality to add a dive to an arbitrary dive in the add_dive_to_table_function(). The difference compared to record_dive_to_table is that dives are added at a specific position or the sort-criterion given by dive_less_than(). This will allow to use a dive tabe for trips instead of a linked list. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Core: unify insert_trip() and insert_trip_dont_merge()Gravatar Berthold Stoeger
There were two versions of the insert_trip() function: one would merge trips if a trip with the same date already existed, the other wouldn't. The latter was introduced with the dive-list undo work. The problem is that the "date" of a trip (i.e. the first dive) seems ill-defined as this is a volatile value. Moreover in the context of making dive-import undoable this is a very dangerous notion, as the caller needs control over when the dives are added to a trip. Therefore, unify these two functions and never merge trips. The decision on merging dives now has to made by the caller. This will be implemented in a future commit. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-18Fix Cressi interface ftdi opening bugGravatar Daniel Krupp
The Cressi specific PID was not used when serial_ftdi_open_device tried to open the device. Reported-by: Daniel Krupp Signed-off-by: Daniel Krupp <daniel.krupp@gmail.com>
2018-11-16Dive list: use dive trip time as additional sort criterionGravatar Berthold Stoeger
The DiveTripModel places dives after trips in chronologically ascending mode if the dive and the trip start at the same instant. But in the core the sort order was undefined. This could lead to a discrepancy. Therefore, implement the same sort-criterion in the core code. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-16More accurate CNS calculations (following comments on github)Gravatar willemferguson
Update table of maximum oxygen exposure durations, used in CNS calulations. This table shows the official NOAA maximum O2 exposure limits (in seconds) for different PO2 values. It also gives slope values for linear interpolation for intermediate PO2 values between the tabulated PO2 values in the 1st column. Top & bottom rows are inserted that are not in the NOAA table: (1) For PO2 > 1.6 the same slope value as between 1.5 & 1.6 is used. This exptrapolation for PO2 > 1.6 likely gives an underestimate above 1.6 but is better than the value for PO2=1.6 (45 min). (2) The NOAA table only tabulates values for PO2 >= 0.6. Since O2-uptake occurs down to PO2=0.5, the same slope is used as for 0.7 > PO2 > 0.6. This gives a conservative estimate for 0.6 > PO2 > 0.5. To preserve the integer structure of the table, all slopes are given as slope*10: divide by 10 to get the valid slope. The columns below are: po2 (mbar), Maximum Single Exposure (seconds), single_slope, Maximum 24 hour Exposure (seconds), 24h_slope */ Then update Calculations of the CNS for a single dive - this only takes the first divecomputer into account. The previous version of the code did a table lookup and used the max O2 exposure for the next-higher PO2 category. This gave a shorter max O2 exposure time and a higher CNS contribution for a specific dive segment, resulting in a slightly conservative value of CNS, often some 2 - 3 % too high. This code does an interpolation for PO2 values inbetween PO2 entries in the lookup table and therefore results in a more accurate maximum O2 exposure time for that PO2. The maximum O2 exposure duration for each segment is also calculated based on the mean depth of the two samples (start & end) that define each segment. The CNS contribution of each segment is found by dividing the time duration of the segment by its maximum exposure duration. The contributions of all segments of the dive are summed to get the total CNS% value. This is a partial implementation of the proposals in Erik Baker's document "Oxygen Toxicity Calculations" */ Overall, this PR does not radically alter the existing CNS calculation, it only makes it more accurate and more consistent by doing interpolation and by using mean segment depth to find PO2. Signed-off-by: willemferguson <willemferguson@zoology.up.ac.za>
2018-11-16Dive list: correctly translate trip dateGravatar Berthold Stoeger
Adapt get_trip_date_string() to use the same logic as get_dive_date_string(): Use the static "loc" object to translate date. Before, the trip date was shown in C locale. Reported-by: Philippe Massart <philippe@philmassart.net> Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-12Coding style: remove stray ';'Gravatar Berthold Stoeger
There was a stray semi-colon on the beginning of a line in DiveObjectHelper.cpp. Remove it. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-12Cleanup: remove unsused flags in struct dive_tripGravatar Berthold Stoeger
Usage of the flags expanded, selected and fixup was removed some time ago. Remove the flags too. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-11-01Core: use British translations in South AfricaGravatar Dirk Hohndel
For unrecognized locales we use en_US by default. It makes much more sense for South Africa to use en_GB. Reported-by: Willem Ferguson <willemferguson@zoology.up.ac.za> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2018-10-31Core: Do not crash on save dives with no dive site (git storage)Gravatar Jan Mulder
And fix a crash very similar to the previous commit. When trying to save (to git) with an empty dive site, ssrf crashes. Again, add a simple guard to prevent this. Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
2018-10-30Fix gasmix for OTU calculationGravatar Robert C. Helling
With the fixed sematics of get_gasmix to return the new gasmix for the time of a gas switch (added comments to make this clear), in the OTU calculation we need the previous gasmix for the interval up to the current time. Signed-off-by: Robert C. Helling <helling@atdotde.de>
2018-10-30Fixed get_gas_at_time for equal timesGravatar Robert C. Helling
This fixes a subtle bug introduced in 5c4569247a31c which unified two functions finding the gasmix at a given time during the dive. There was a slight difference, though: Does a gaschange exactly at that time count or not? For the planner to work, the answer has to be in the affirmative. Signed-off-by: Robert C. Helling <helling@atdotde.de>
2018-10-29Dive list: don't pass dive_site via uintptr_t through QMLGravatar Berthold Stoeger
Now that struct dive_site * is a proper Q_METATYPE it is not necessary anymore to pass dive-sites as opaque uintptr_t types. Simply pass a QVariants or directly via dive_site *. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-29Dive site: pass pointer-to-dive_site via QVariantGravatar Berthold Stoeger
There was this ugly pattern of passing pointers-to-dive_site via a QVariant of void * type. This is of course inherently unsafe. Pass these pointers using their proper types instead. This makes it necessary to register them in Qt's meta-type system. Doing so, fixes a bug: QML couldn't call into updateDiveSiteCoordinates() because it didn't know the type and thus the coordinates of the moved flag were not reflected in the divesite-dialog. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-29Dive site: replace dive->dive_site_uuid by dive_siteGravatar Berthold Stoeger
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-29Dive site: use an array of pointers in reloadMapLocations()Gravatar Berthold Stoeger
MapWidgetHelper::reloadMapLocations() used an array of uuids to add dive sites to the map only once. Replace this by an array of pointers. This is a small piece of a larger effort to remove dive site UUIDs. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>