Connect cylinders entered in planner with the gases available

Now the gases for which we have cylinders are offered in the gas selection
list and correctly recognized and added for the plan.

Still tons of work to be done to make this work the way it is designed,
but we are getting closer.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
When entering a new point, pick the previous gas by default

This is much more useful than always picking air.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Add depth colum to cylinder model

To make the planner work this adds a new column to the Cylinder widget
(depth - for the depth at which we want to change to a certain gas
during deco).

This also tries to hide that column in the equipment view and hide the
start/end pressure columns in the planner view. Oddly that fails :-(

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Make planner work again

This partially reverts changes in commit 1b655d5c806b ("Correctly track
gases when manually adding and then editing dives") as it turns out this
did NOT help us correctly track gases (which is ironic, given the title of
that commit). I didn't actually want to revert that commit as
infrastructure has changed since then and this made the patches look even
more incomprehensible.

So we are back to tracking the "gas on which we arrive at this spot" in
each dive plan node as this makes the rest of our planning so much easier
- I had forgotten about the reasons why we did things this way when I made
the above mentioned commit.

Instead we now make sure that our available tanks are added the correct
way, that such entries are ignored when planning and when drawing the
editable profile, and that at the end it all gets assembled correctly.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Remove some debug output

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
First steps to make add dive work with the correct infrastructure

This just makes sure that we do the right thing with the staging drive,
that we don't mess up the selection, the we are smart about using our
helper functions, etc.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Handle add dive cancel correctly

This should leave the program in a consistent state after add dive was
cancelled (and do the right thing in case the dive list was empty).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Use existing helper function

And remove spurious extra ';'

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Make gas selection for add dive work

This now offers the correct gases for which we have cylinders defined.

For both the planner and add dive we still don't end up with the correct
cylinders in the resulting dive. But that's for another commit to fix.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Only auto-complete gps information when empty.

Previously gps information was always overwritten, unless the user had
modified it in the current editing session. This causes problem with
some use cases, like when coordinates are provided before the location
name by the companion app.

Now gps information is only overwritten when it is:
  - Empty
  - Auto-completed in the current editing session. (When the user hits
    accept it is considered hand-edited.)

Signed-off-by: Michael Andreen <harv@ruin.nu>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Make fake profile average depth come out right

This isn't perfect as it doesn't really cover all cases. If we need to
generate a profile for some fairly insane cases, the stupid thing just
gives up rather than try to search for a solution that satisfies the
constraints.

For example, if you have a maxdepth=10m and an average depth of 9.9m, it
will try two different (roughly sane) dive profiles, fail to get anything
that matches that kind of dive and that average depth, and then just say
"screw it, I'll match an insane profile instead" and basically generate a
rectangular dive.

It does seem to handle the few cases I tried.

Somebody should double-check my math, and I think we might want to make
the "default profiles" a bit saner. Right now the preferred default
profile simply says "ascent/descent rate of 5m/min, with two levels at
max_depth and 1/3rd maxdepth".

That profile might not work for the simple reason that maybe we did a
quick dive to 40m, but then came up and spent a lot of time in shallower
waters, so our average depth was just 10m or so. Obviously we can *not*
make a dive that has the two depths 40m and 13m come out to an average of
10m deep.

So it has a fallback for things like that, where we try to generate a
profile with a faster ascent/descent rate, and a shallower second depth.

And then there's the fallback with an insane 10m/s ascent/descent rate and
a second depth that is basically at the surface, and if we can't generate
a dive profile with those parameters, either my math is wrong, or somebody
was playing with rockets under-water. So we just give up.

There's a few other heuristics too (if there is no average depth, we
create a random one just to make the profile look reasonable).

I *think* this is all perfectly fine, but I do want others to take a look.
It might be doing something stupid.

[Dirk Hohndel: after the discussion I took the patch and reworded parts of
               the commit message]

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Fill up plot_data with temperature all the way

This will fill out the gaps of temperature data between all the points
so we always have a temperature to show in the info box.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Introduce a on/off switch for calculating ndl/tts

Let the user choose if the calculation of ndl and tts is worth the time
it takes.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Remove the special handling of ndl < 3m

This changes from a special handling of ndl calculations when we
deem that we are to shallow for doing them. Previously we just sat ndl
to -1 and printed a -, now we return and print max_ndl, just as how most
divecomputers work.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Break up calculate_deco_information

Break the huge calculate_deco_information into three different
functions. One for the current deco calculations, one for the
ndl/tts/deco stop and one for the gas calculations.
This makes it easier to disable/enable different functionality.

This also gets rid if the ccrdive state variable, and keeps that state
in the plot_data struct. Now we calculate the deco before we calculate
the gas properties, so if we have a po2, were in ccr-mode, and if we
don't were in oc mode.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Break calculated deco info to separate vars

Store the calculated values in separate variables in the plot_data
struct, and display them separate. This makes sure we don't confuse the
calculated values with the ones from a dc, and now we can compare the
two.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Reorder info in information window

When moving along the plot, its hard to look at a certain value when its
place in the info box moves due to that values are added above it. This
moves the stable values up top in the info box and the values that comes
and goes further down, so that the box expands downwards.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
TODO notes