summaryrefslogtreecommitdiffstats
path: root/divelist.c
AgeCommit message (Collapse)Author
2015-10-30Move all core-functionality to subsurface-coreGravatar Tomaz Canabrava
And adapt a new CMakeLists.txt file for it. On the way I've also found out that we where double-compilling a few files. I've also set the subsurface-core as a include_path but that was just to reduce the noise on this commit, since I plan to remove it from the include path to make it obligatory to specify something like include "subsurface-core/dive.h" for the header files. Since the app is growing quite a bit we ended up having a few different files with almost same name that did similar things, I want to kill that (for instance Dive.h, dive.h, PrintDive.h and such). Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-06Mark divelist as changed even if imported dives got mergedGravatar Dirk Hohndel
The number of dives didn't go up, but we have one (or more) additional dive computers added to an existing dive. Fixes #936 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02Avoid working with invalid dive indicesGravatar Dirk Hohndel
When calling merge_two_dives both dives should be in the dive list so i and j should never be -1. But just as extra precaution, bail if that's the case (so that the helper functions below aren't called with negative indices). Coverity CID 1189514 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01Make add_single_dive() grow the divelist allocation if necessaryGravatar Linus Torvalds
We only made sure the divelist allocation was big enough in "record_dive_to_table()", but add_single_dive() can add entries too. Now, in practice that never bit anybody, since (a) we allocate extra entries anyway, and it would be very unusual that the divelist table was exactly full (b) most "malloc()" implementations end up having their own slop on top of that (c) add_single_dive() was only used for merging dives, which actually ends up removing more divex than it adds (but it does add one first) but when I'm starting to split dives, this will be a bigger issue in practice. And it was wrong. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-08-31Introduce double depth_to_bar()Gravatar Robert C. Helling
as it leads to significant cleanup. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-08-31Calculate ceiling only when it is neededGravatar Robert C. Helling
So far, add_segment() returned a tissue tolerance (i.e. ceiling) computed just in its return statement. This tissue_tolerance needed to be dragged around until it was needed or be dropped if not needed at all. As for VPM-B, this ceiling computation is a bit expensive, this patch calls the computation function tissue_tolerance_calc() when the value is actually needed and not before. This changes the signature of some functions. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-08-25Clear the displayed dive and dive site when clearing dive dataGravatar Dirk Hohndel
Otherwise some artefacts of the last dive / dive site that where shown can remain visible even after the dive data was closed. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-07-24QML UI: make sure the dive list is empty before loading divesGravatar Dirk Hohndel
When testing subsurface-mobile on the desktop from an account that had a default file set up in the Subsurface preferences that file would already be loaded creating rather confusing output. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-06-20Track minimum datafile versionGravatar Dirk Hohndel
Add infrastructure and helper functions to track minimum datafile version. To make this information useful we need to keep the XML and git data format versions in track moving forward. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-06-12Indicate that there are unsaved changes with a '*' in the window titleGravatar Dirk Hohndel
This seems to be a fairly common way to indicate this property. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-06-01Simplify model handling and crashes fixesGravatar Tomaz Canabrava
So, there's only one crash left (that I put a big TODO: on the maintab.cpp about) and I'll fix it tomorrow as it's quite late here and I'm almost sleeping at the keyboard. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-02-12Change one more spot in divelist.c from locations to dive sitesGravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-02-12Get trip location from dive's dive siteGravatar Dirk Hohndel
This adds another useful helper function as well. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-01-25Have get_dive_gas return air when without cylindersGravatar Anton Lundin
If we called get_dive_gas on a dive without cylinders, we returned 100%, which is quite wrong. This makes us return air as default gas instead. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-01-06Always show deco gas as dive gasGravatar Anton Lundin
This unifies how we prints Nitrox deco gas dives with Trimix deco gas dives. Reviewed-By: Joakim Bygdell <j.bygdell@gmail.com> Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-01-02Fix a crash when dive date is epochGravatar Miika Turkia
With a dive that's date is 1970-01-01, starting at 00:00 the assert causes subsurface to crash when performing auto grouping. This happens to be a perfectly valid date, and we might end up getting such dates when importing dives from other software, so removing the assert. Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-11-12Deselect dives that are no longer shown as the dive list is filteredGravatar Dirk Hohndel
This cleans up the way we ensure that all dives are handled as the dive list is filtered. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-11-11Dive list and filter: when selecting a trip, only select visible divesGravatar Dirk Hohndel
Otherwise dives that aren't shown to the user would be included in statistics or (worse) in edit operations. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-11-04Offer to save to a copy in replan modeGravatar Robert C. Helling
When replannig a dive, offer another button that creates a new dive rather than overwriting the old. This should help in creating several versions of a planned dive (longer/shorter, deeper/shallower etc). Note that this makes dives that start at the same time not influcence each other's deco. Also, only the first of a row of simultaneous dives contributes to the tissue loadings of later dives. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-11-04Prepare for PSCR calculationsGravatar Robert C. Helling
Calculations for passive semi-closed rebreathers are pretty much like OC except the pO2 is lower bey a certain (SAC dependent) factor. This patch introduces the corresponding calculations in case dctype == PSCR which is so far never set and there is currently no UI for these calculations. As pO2 is SAC dependent it takes a certain attempt at getting it and drops to defaults from the prefs otherwise. As there is no UI at this point and I also don't have any dives, this has not received much testing, yet, but it compiles. At least. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-10-19Make planner work again for CCR divesGravatar Robert C. Helling
The latest CCR patches had rendered the planner not usable for CCR dives. This patch corrects this (and reenables the CCR set point column for segments). The problem was that a new member setpoint of struct divepoint had been introduced, but there was already po2 which had the same meaning. This patch merges the two and renames them setpoint to prevent future confusion. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-08-18Planner: assign a dive number if the right number seems obviousGravatar Dirk Hohndel
Use the same logic as we do for newly added dives. As a side effect this patch appears to fix the issues with getting the newly planned dive selected. Fixes #692 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-08-16Make divelist gas column slightly easier to understandGravatar Dirk Hohndel
Since printing EANxx was met with a lot of resistance as it wastes space, maybe this makes things slightly better at least. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-08-11Rename dive gas function and defines for clarityGravatar Anton Lundin
This renames the dive gas functions to not talk about just nitrox, and to instead talk about gas. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-18get_gas_at_time needs to always give us a valid gasv4.1.91Gravatar Dirk Hohndel
Before this function was changed it was really supposed to just change a gas that was passed in in case there was an event that changed the mix - but with the new name the caller will assume that they get a valid gasmix. And promptly we had one caller that didn't initialize gas to be based on the first cylinder before calling get_gas_at_time(). Instead of adding yet one more spot that knows about the oddity of the old API I simply changed get_gas_at_time() to do what it name appears to imply and fixed the other callers not to bother to initialize the gasmix. Fixes #647 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-18Use get_gas_at_time in active_o2Gravatar Anton Lundin
active_o2 is now just a wrapper to return the o2 part of the active gas at a certain time. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-17Replace cylinder_is_used with is_cylinder_usedGravatar Anton Lundin
is_cylinder_used uses get_cylinder_index as underlaying function that does the right thing with with respect on how to find the closest matching cylinder, and handles both types of gaschange events correctly. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-08Considering previous dives for tissue loadingGravatar Robert C. Helling
This (hopefully) gets the logic to find dives in the previous 48h for tissue pre-loading right. In particular it handles the case of a planned dive which has a number of -1. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-03Don't crash if get_divenr is called with NULL argumentGravatar Dirk Hohndel
We shouldn't be doing that, but still, let's not crash. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-07-02UI restructure: fix get_divenr to do the right thing on a copy of a diveGravatar Dirk Hohndel
We should not care if the dive has the same address in memory. We care if it is the same dive (by using the unique ID). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-25Deco artefacts with low GFlowGravatar Robert C. Helling
In a dive, when you choose a very low GFlow (like 5 or 9) and a trimix with quite some He (12/48 in the example) and descend fast, the ceiling seems to do strange things in the first minutes of the dive (very very deep for example or jumping around). To understand what is going on we have to recall what gradient factors do in detail: Plain Buehlmann gives you for each tissue a maximal inert gas pressure that is a straight line when plotted against the ambient pressure. So for each depth (=ambient pressure) there is a maximally allowed over-pressure. The idea of gradient factors is that one does not use all the possible over-pressure that Buehlmann gives us but only a depth dependent fraction. GFhigh is the fraction of the possible over-pressure at the surface while GFlow is the fraction at the first deco stop. In between, the fraction is linearly interpolated. As the Buehlmann over-pressure is increasing with depth and typically also the allowed overpressure after applications of gradient factors increases with depth or said differently: the tissue saturation has to be lower if the diver wants to ascent. The main problem is: What is the first stop (where to apply GFlow)? In a planned dive, we could take the first deco stop, but in a real dive from a dive computer download it is impossible to say what constitutes a stop and what is only a slow ascent? What I have used so far is not exactly the first stop but rather the first theoretical stop: During all of the dive, I have calculated the ceiling under the assumption that GFlow applies everywhere (and not just at a single depth). The deepest of these ceilings I have used as the “first stop depth”, the depth at which GFlow applies. Even more, I only wanted to use the information that a diver has during the dive, so I actually only considered the ceilings in the past (and not in the future of a given sample). But this brings with it the problem that early in the dive, in particular during the descent the lowest ceiling so far is very shallow (as not much gas has built up in the body so far). This problem now interferes with a second one: If at the start of the dive when the all compartments have 790mbar N2 the diver starts breathing a He-heavy mix (like 12/48) and descents fast the He builds up in the tissues before the N2 can diffuse out. So right at the start, we already encounter high tissue loadings. If now we have a large difference between GFhigh and GFlow but they apply at very similar depth (the surface and a very shallow depth of the deepest ceiling (which for a non-decompression dive would be theoretically at negative depth) so far) it can happen that the linear interpolation as opposite slope then in the typical case above: The allowed over-pressure is degreasing with depth, shallower depth do not require lower gas loading in the tissue (i.e. can be reached after further off-gasing) but but tolerate higher loadings. In that situation the ceiling disappears (or is rather a floor). So far, I got rid of that problem, by stating that the minimum depth for GFlow was 20m (after all, GFlow is about deep stops, so it should better not be too shallow). Now the dive reported in ticket #549 takes values to an extreme in such away that 20m (which is determined by buehlmann_config.gf_low_position_min in deco.c) was not enough to prevent this inversion problem (or in a milder form that the interpolation of gradient factors is in fact an extrapolation with quite extreme values). This patch that gets rid of the problem for the dive described above but still it is possible to find (more extreme) parameter choices that lead to non-realistic ceilings. Let me close by pointing out that all this is only about the descent, as it is about too shallow depth for GFlow. So no real deco (i.e. later part of the dive) is inflicted. This is only about a theoretical ceiling displayed possibly in the first minutes of a dive. So this is more an aesthetically than a practical problem. Fixes #549 Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-18CNS doesn't increase when PO2 is below 0.5 atmGravatar Anton Lundin
When chasing other bug in CNS code i found this. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-12Correct pO2 formula in CNS calculation.Gravatar Robert C. Helling
In commit e58f54cac1d0 ("Fix ATM-vs-bar confusion") Linus broke the CNS calculations; The partial pressure is fraction of gas times ambient pressure, not divided by. [Dirk Hohndel: identical patch sent by Robert and Anton; I combined the commit messages and added the ACK from the perpetrator] Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Anton Lundin <glance@acc.umu.se> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-04Fix typo that broke gas reporting in dive listGravatar Dirk Hohndel
The brainless idiot who implemented commit c539c8f86192 ("Remove the .used member of the cylinder structure") clearly worked on the basis of "it compiles, it must be perfect". Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-03CCR code: Change to sample structureGravatar Willem Ferguson
1) All the variables in the sample structures are strongly typed 2) Two additional types were declared in units.h: o2pressure_t bearing_t 3) The following variables were added: diluentpressure o2setpoint o2sensor[3] 4) Changes to a number of files were made to chanf sample->po2 to sample->po2.mbar bearing to bearring.degrees Signed-off-by: Willem Ferguson <willemferguson@zoology.up.ac.za> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-01Remove the .used member of the cylinder structureGravatar Dirk Hohndel
Instead calculate this information on the fly, taking into account all dive computers on the dive in questions. There is one wrinkle to this - previously we abused the '.used' member to make sure that a manually added cylinder didn't disappear the moment it was added (think of the workflow: you add a cylinder, then you add a gas change to that cylinder -> right after you add it it is unused and would not be shown). I am thinking that we might have to add the "manually_added" property to the properties that we store in XML / git. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-06-01Encapsulate the horrid gas encoding in gas change eventsGravatar Dirk Hohndel
We should never pass permille values around as integers. And we shouldn't have to decode the stupid value in more than one place. This doesn't tackle all the places where we access O2 and He "too early" and should instead keep passing around a gaxmix. But it's a first step. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-24Dive list: move trip merging logic into divelist.cGravatar Dirk Hohndel
This also fixes a couple of issues with the existing code: - removes a memory leak - treats null and "" the same Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-24Dive list: move trip selection / deselection logic to divelist.cGravatar Dirk Hohndel
This is core logic, not UI code. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-24Add some helper functionsGravatar Dirk Hohndel
First step towards getting the "add to trip" logic in the divelist context menu to be consistent and correct. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-20Use get_o2 instead of local versionGravatar Anton Lundin
Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-19Remove unused variablesGravatar Dirk Hohndel
These were leftover in commit 90638180d21a ("Use the used flag on cylinders in get_dive_gas"). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-14Mark new dives "downloaded" when importing new divesGravatar Linus Torvalds
We used to do this just for dive computer downloads, but we should do it for all imports, so that merging new import data always does the expected thing: any new dive computers will be added to the end of the list of preexisting dives, rather than the other way around. (Of course, if you set the "prefer downloaded" flag, that reverses this logic, and makes the newly imported dive computer data be the primary dive computer. That flag is currently only exported for dive computer downloads, not for imports). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-13Do not check for null before free.Gravatar Tomaz Canabrava
C specs says that we can safelly free a NULL pointer, so there's no reason to check if it's null before freeing it. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-05-08Use the used flag on cylinders in get_dive_gasGravatar Anton Lundin
Now when we have a used flag on every cylinder that are set in mark_used_tanks we can use it here. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-04-26Don't calculate SAC-rates for negative pressure changesGravatar Linus Torvalds
They happen - maybe the cylinder actually warmed up, or maybe the user entered just a ending pressure without a starting pressure. Regardless, just ignore cylinder pressure changes that go up. Also ignore cylinders with a zero ending pressure: that's really a *missing* pressure rather than an actual zero pressure. As Dirk says, the scuba regulators don't even work without a healthy positive pressure differential, so even when you breathe down a tank to "empty", it won't be at zero pressure (this is true even with gauge pressure, where zero means "atmospheric pressure"). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-03-10Get rid of crazy empty tag_list element at the startGravatar Linus Torvalds
So this is totally unrelated to the git repository format, except for the fact that I noticed it while writing the git saving code. The subsurface divetag list handling is being stupid, and has a initial dummy entry at the head of the list for no good reason. I say "no good reason", because there *is* a reason for it: it allows code to avoid the special case of empty list and adding entries to before the first entry etc etc. But that reason is a really *bad* reason, because it's valid only because people don't understand basic list manipulation and pointers to pointers. So get rid of the dummy element, and do things right instead - by passing a *pointer* to the list, instead of the list. And then when traversing the list and looking for a place to insert things, don't go to the next entry - just update the "pointer to pointer" to point to the address of the next entry. Each entry in a C linked list is no different than the list itself, so you can use the pointer to the pointer to the next entry as a pointer to the list. This is a pet peeve of mine. The real beauty of pointers can never be understood unless you understand the indirection they allow. People who grew up with Pascal and were corrupted by that mindset are mentally stunted. Niklaus Wirth has a lot to answer for! But never fear. You too can overcome that mental limitation, it just needs some brain exercise. Reading this patch may help. In particular, contemplate the new "taglist_add_divetag()". Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-03-08Another case of 'dereference before NULL check'Gravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-03-08Don't use dive before checking it against NULLGravatar Dirk Hohndel
Dive gets dereferenced in get_surface_pressure_in_mbar(). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-03-03Remove pointless assignmentsGravatar Dirk Hohndel
tissue_tolerance wasn't used after it was assigned. type was overwritten after it was assigned. serial was overwritten after the last /= 100. event is assigned in the for loop. clear isn't used after the assignment Signed-off-by: Dirk Hohndel <dirk@hohndel.org>