aboutsummaryrefslogtreecommitdiffstats
path: root/planner.c
AgeCommit message (Collapse)Author
2013-06-27Removes circle in planGravatar Robert Helling
Remove circle in plan by starting the first line at the first point rather than the last. In addition marks all entered points as entered and not just the first and sets line color accordingly. Makes plan_add_segment return the added data point. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-06-23Perform deco calculation for planGravatar Dirk Hohndel
This uses a bunch of default values that we eventually need to get from the UI, but it's a first step towards a working dive planner. This exhibits some graphical artifacts when running, but other than that appears to be mostly correct. Things go far worse if I enable the changing of the scale once the deco makes the dive longer than the displayed time window. Things quickly spiral out of control. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-06-23Start hooking in the deco calculationsGravatar Dirk Hohndel
I expanded the DiveHandler to include the actual time / depth of each node on the graph - this way things will stay consistent if we need to rescale the graph. One thing that this makes obvious is that the whole design for the planner so far assumes metric data. We need to make sure this works well with feet instead of meters as well (and that it uses the information in the units settings). With this change we actually create a dive based on the plan input and add the deco stops (if needed) to it - but we don't do anything with the results of those calculations, yet. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-05-17Merge branch 'Qt'Gravatar Dirk Hohndel
After the 3.1 release it is time to shift the focus on the Qt effort - and the best way to do this is to merge the changes in the Qt branch into master. Linus was extremely nice and did a merge for me. I decided to do my own merge instead (which by accident actually based on a different version of the Qt branch) and then used his merge to double check what I was doing. I resolved a few things differently but overall what we did was very much the same (and I say this with pride since Linus is a professional git merger) Here's his merge commit message: This is a rough and tumble merge of the Qt branch into 'master', trying to sort out the conflicts as best as I could. There were two major kinds of conflicts: - the Makefile changes, in particular the split of the single Makefile into Rules.mk and Configure.mk, along with the obvious Qt build changes themselves. Those changes conflicted with some of the updates done in mainline wrt "release" targets and some helper macros ($(NAME) etc). Resolved by largely taking the Qt branch versions, and then editing in the most obvious parts of the Makefile updates from mainline. NOTE! The script/get_version shell script was made to just fail silently on not finding a git repository, which avoided having to take some particularly ugly Makefile changes. - Various random updates in mainline to support things like dive tags. The conflicts were mainly to the gtk GUI parts, which obviously looked different afterwards. I fixed things up to look like the newer code, but since the gtk files themselves are actually dead in the Qt branch, this is largely irrelevant. NOTE! This does *NOT* introduce the equivalent Qt functionality. The fields are there in the code now, but there's no Qt UI for the whole dive tag stuff etc. This seems to compile for me (although I have to force "QMAKE=qmake-qt4" on f19), and results in a Linux binary that seems to work, but it is otherwise largely untested. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-05-03planning: Add option to have last stop at 6m/20ftGravatar Anton Lundin
When diving in areas where there are risk of boats passing above you, its common practise to do the last stop at 6m to better stay out of harms way. When doing o2-deco, it doesn't matter for the deco time if you are doing all the time at 6m, due to that you don't have any inert gas in your breathing gas. This code is a reintroduction of 0b8462bd lost somehow between a70a8898..8fae0031 Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-05-03Remove the majority of the Gtk related codeGravatar Dirk Hohndel
- rip all Gtk code from qt-gui.cpp - don't compile Gtk specific files - don't link against Gtk libraries - don't compile modules we don't use at all (yet) - use #if USE_GTK_UI on the remaining files to disable Gtk related parts - disable the non-functional Cochran support while I'm at it Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-04-08Separate Gtk related code from core logic: plannerGravatar Dirk Hohndel
Relatively straight forward, just a handful of places where we call show_error() (a UI function) from the logic code. In the process I noticed a few places where error returns weren't dealt with correctly. Added a new planner.h files for the necessary declarations. This should make no difference to functionality. Signed-off-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-04-07Separate Gtk related code from core logic: plannerGravatar Dirk Hohndel
Relatively straight forward, just a handful of places where we call show_error() (a UI function) from the logic code. In the process I noticed a few places where error returns weren't dealt with correctly. Added a new planner.h files for the necessary declarations. This should make no difference to functionality. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-04-02planning: Add option to have last stop at 6m/20ftGravatar Anton Lundin
When diving in areas where there are risk of boats passing above you, its common practise to do the last stop at 6m to better stay out of harms way. When doing o2-deco, it doesn't matter for the deco time if you are doing all the time at 6m, due to that you don't have any inert gas in your breathing gas. Signed-off-by: Anton Lundin <glance@acc.umu.se> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-03-26Make relative times default in planner 2Gravatar Robert C. Helling
In planning you usually plan lengths of segments rather than runtimes to leave a level. This patch superseeds a previous one with a similar name and (even more) broken spacing. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-03-17Manually add gas changes to a diveGravatar Dirk Hohndel
Create a little widget that lists all the gases / tanks we know about and allow the user to pick one of them. Turns out that add_event only added events at the end of the list - but we treat that list as chronologically sorted. So I fixed that little mis-feature as well. This does raise the question whether we need the inverse operation (removing a gas change). And if there are other things that we should be able to manually edit, now that we have the infrastructure for this neat little context menu... See #60 -- this doesn't address all of the issues mentioned there, but at least deals with the 'headline' of the feature request... Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-03-07Fix potentially broken white space truncation on certain Windows versionsGravatar Lubomir I. Ivanov
Testing the Planner in Subsurface on a Windows XP SP3 installation, shows corrupted UTF-8 strings in the case of Cyrillic locales, but possibly others as well. Instead limited to the Planner, this affects the entire application. After some examination it appears that <ctype>'s isspace() in MSVC on the tested version of Windows is broken for some UTF-8 characters, after enabling the user locale using: setlocale(LC_ALL, ""); For example, characters such as the Cyrillic capital "BE" are defined as: 0xD091, where isspace() for the first byte returns 0x08, which is the bytemask for C1_SPACE and the character is treated as space. After a byte is treated as space, it is usually discarded from a UTF-8 character/string, where if only one byte left, corrupting the entire string. In Subsurface, usages of string trimming are present in multiple locations, so to make this work try to use GLib's g_ascii_isspace(), which is a locale agnostic version of isspace(). Affected versions of Windows could be everything up to XP SP3, but not apparently Vista. Reported-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-27Planner: don't use the planned dive for relative start timeGravatar Dirk Hohndel
The existing code has an embarrassing error in its logic. It picked the last dive in the table and made sure that the relative start time was either N minutes after 'now' or N minutes after the last dive ends, whichever is later. But once the planned dive has been added to the dive list (so once we have a first depth and time entry, that last dive now is the planned dive. And every time focus left the start time field the start time would be recalculated relative to the end of the dive we are currently planning. With this patch we instead simply remember the number of the last dive just as we create the dive plan and use that to look up the end time of previous dive. I could have just stored that end time but I figured maybe there could be other reasons to go back to the last dive before the planned dive, so this seemed cleaner. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-27Planner: use time.h and utc_mktime() to retrive the current time (no TZ)Gravatar Lubomir I. Ivanov
This should do the same as the GTimeZone variant. Also works on Windows. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-23Planner: fix wait time calculationsGravatar Robert C. Helling
The problem is that when we reach the gas change depth and compute the stop time, no gas change event is created yet but time_at_last_depth tries to determine the gas for the stop from events. So instead we pass o2 and he as parameters of that function and calculate the wait time based on that information. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-19Planner: fix incorrect gas change eventGravatar Dirk Hohndel
We stored the He permille instead of the He percentage. But for most casual testing this was hidden by the previous bug. Reported-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-19Planner: Start calculations with gas 0 instead of airGravatar Dirk Hohndel
The planner had a fatal flaw in that it ALWAYS started with AIR, even when clearly claiming to use the correct gas. We only picked up correct gases from events, but not at the beginning of the dive (where there is no event). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-14Ensure that planner warnings get shown before calculations are runGravatar Dirk Hohndel
Linus pointed out that the warning wasn't shown until the main loop got control back, so even a gtk_widget_show_all() doesn't really help to make sure that things are shown right then. This commit adds a little loop to handle all pending gtk_events before exiting the show_error() function. Now the warning should be shown BEFORE a potentially slow calculation gets started. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-13Make planner.c warning consistentGravatar Dirk Hohndel
Just a tiny change to make them look more consistent. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-13Support deeper stops and longer dive notes in plannerGravatar Dirk Hohndel
Since we now support dives all the way down to 400m we should also support deeper stops. And of course this can create insanely long dive plans, so make sure there is plenty of space for those. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-13Rewriting the error handling in planner.cGravatar Dirk Hohndel
Printf is not a way to issue warnings and errors. This is a very late addition but seems necessary for a viable release of the planner. This also adds one artificial limit and two warnings: a) no dives deeper than 400m b) warning of potentially very long calculation times for dives longer than 3h (180min) before the ascent and dives deeper than 150m It also creates quite a number of new strings that need to be translated (and marks a few existing ones for translation as well). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-12Remove rounded O2 in airGravatar Dirk Hohndel
To quote Linus, gentle as always: Stuff like this is just BS. Don't do it. You already fixed the bug with matching gas change events, so adding this idiotic workaround no longer fixes anything, and its confusing and actively misleading. It's not even percent. It's still permille, just rounded. So it's a nonsensical number and a misleading name. Just delete it as the abortion it is. It is only going to cause more problems later. Just use the correct value. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-12Fix gas handling in plannerGravatar Dirk Hohndel
Two separate bugs. a) Air cylinders were created with o2=209 and no other value set. sanitize_gasmix() turned that into o2=0 which meant that this cylinder was now identified as "nodata", i.e., unset. We now set a fake cylinder name to deal with that issue. b) the gaschange event is inherited from libdivecomputer and therefore only supports 1 percent granularity for o2 and h2. Since we didn't round when assigning the value we ended up with air being stored as o2=20 he=0 which of course then didn't match air anymore (which we have defined as 208 <= o2 <= 210). We now use o2=210 for air in the planner and carefully round the permille values whenever we convert into percent - and compare gases with percent granularity as well. A better fix for b) would be to change the Subsurface event to not simply copy the libdivecomputer behavior and use percent granularity but support permille instead. But this closely before the 3.0 release that seemed like a far too invasive change to make - the changes to the planner should have no impact outside the planner module. Reported-by: Chris Lewis <chrislewis915@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-09Hopefully last change to po filesGravatar Dirk Hohndel
While this is a pain for everyone, I decided not to edit out the code reference noise - after all this is supposed to help translators find where the text is used in case it's unclear how to translate something. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-08Do more dive fixup for each dive computerGravatar Linus Torvalds
In commit b6c9301e5847 ("Move more dive computer filled data to the divecomputer structure") we moved the fields that get filled in by the dive computers to be per-divecomputer data structures. This patch re-creates some of those fields back in the "struct dive", but now the fields are initialized to be a reasonable average from the dive computer data. We already did some of this for the temperature min/max fields for the statistics, so this just continues that trend. The goal is to make it easy to look at "dive values" without having to iterate over dive computers every time you do. Just do it once in "fixup_dive()" instead. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-09Clean up the handling of surface pressureGravatar Dirk Hohndel
There are two ways to look at surface pressure. One is to say "what was the surface pressure during that dive?" - in that case we now return an average over the pressure reported by the different divecomputers (or the standard 1013mbar if none reported any). Or you want to do specific calculations for a specific divecomputer - in which case we access only the pressure reported by THAT divecomputer, if present (and fall back to the previous case, otherwise). We still have lots of places in Subsurface that only act on the first divecomputer. As a side effect of this change we now make this more obvious as we in those cases pass a pointer to the first divecomputer explicitly to the calculations. Either way, this commit should prevent us from ever mistakenly basing our calculations on a surface pressure of 0 (which is the initial bug in deco.c that triggered all this). Similar changes need to be made for other elements that we currently only use from the first divecomputer, i.e., salinity. Reported-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-08Add a more stronly worded warning / disclaimer for dive planningGravatar Dirk Hohndel
This is a late string change, but I think this may be a valid exception of the string freeze... Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Increase the buffer for the gas text in plannerGravatar Sergey Starosek
UTF-8 strings could create more characters. Signed-off-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Merge branch 'po-files'Gravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org> Conflicts: po/nb_NO.po po/ru_RU.po
2013-02-03Distinguish the two uses of "Gas Used" for translation purposesGravatar Dirk Hohndel
One is about the amount, the other about the specific type of gar that was used. Reported-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Increase the buffer for the gas text in plannerGravatar Dirk Hohndel
Translations that use UTF-8 could easily create more characters than I had initially specified. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Fixing SP handling in planner, adding eventGravatar Jan Schubert
This moves some double/floating handling for po2 to plain integer. There are still non int values around (also for phe and po2) in the plot area. Signed-off-by: Jan Schubert <Jan.Schubert@GMX.li> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Fixing SP handling in planner, adding eventGravatar Jan Schubert
Fixing the SP change event and introducing a bailout scenario. I decided not to use a event showing SP=0.0 nor using a gaschange event as is in fact there is no gas change related to bailing out itself. If there is also a gaschange for the event it will be displayed anyway. Signed-off-by: Jan Schubert <Jan.Schubert@GMX.li> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-03Fixing SP handling in planner, adding eventGravatar Jan Schubert
Fixes bug in planner which prevents from bailing out (setpoint = 0). Also introduces events for changing setpoints in planner. It also makes the eventtype for gaschange slightly more consistent by changing it from SAMPLE_EVENT_GASCHANGE (O2 only) to SAMPLE_EVENT_GASCHANGE2 (O2/He). But Subsurface treats them both the same (the distinction comes from libdivecomputer). Signed-off-by: Jan Schubert <Jan.Schubert@GMX.li> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-02-02planner.c: Use g_time_zone_find_interval()Gravatar Lubomir I. Ivanov
current_time_notz(): Attempt to use g_time_zone_find_interval() to retrieve a timezone interval, which is then passed to g_time_zone_get_offset() Reported and tested-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-31Don't allow to plan dives out of orderGravatar Dirk Hohndel
The planned dive always has to be the last dive in the dive list. To make sure of that we interpret the relative start time to be relative to either the current time or the end of the last dive, whichever is later. This fixes a bug where we would delete the wrong dive and get our data structures confused by planning multiple dives out of order. Reported-by: Sergey Starosek <sergey.starosek@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-30Massive cleanupGravatar Dirk Hohndel
Mostly coding style and whitespace changes plus making lots of functions static that have no need to be extern. This also helped find a bit of code that is actually no longer used. This should have absolutely no functional impact - all changes should be purely cosmetic. But it removes a bunch of lines of code and makes the rest easier to read. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-29Add missing strings for translationsGravatar Dirk Hohndel
Mostly in new code, but some of them are strings in older code that have been missed in the past. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-28Make dive planner more useful for closed circuit divingGravatar Dirk Hohndel
Add a sample at time 0 to allow for a pO2 from the start of the dive. Remember the last pO2 so it doesn't have to be repeated (and the right thing happens for the planned part of the dive). This still doesn't allow us to change the setpoint at a certain depth (which would be analogous to being able to switch to a certain gas at a certain depth in OC plans), but with this commit it's already usable. This commit also fixes a couple of small bugs in commit b8ee3de870fa ("Dive planning for closed circuit rebreather") where a pO2 of 1.1 was hardcoded in one place, throwing off all plan calculations and integer math was used to calculate a floating point value (leading to most pO2 values actually used being 1.0). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-28Dive planning for closed circuit rebreatherGravatar Jan Schubert
This misses a single issue to be used as a base for further discussion: The CC setpoint is used for the next segment, not the one specified for. I also have in mind to modify the existing code to use setpoints specified in mbar and plain integer instead of float values. Signed-off-by: Jan Schubert <Jan.Schubert@GMX.li> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-28Clean up gtk combo box handlingGravatar Linus Torvalds
This cleans up our handling of combo boxes and all the duplicated completion logic, and simplifies the code. In particular, we get rid of the deprecated GtkComboBoxEntry. While it made some things easier, it made other things harder. Just using GtkComboBox and setting that up correctly ends up being simpler, and also makes the logic work with gtk-3. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-24Fix compile error in planner.cGravatar Henrik Brautaset Aronsen
Linus seems to have been too eager in the dc refactoring: a diveplan doesn't have a divecomputer. Signed-off-by: Henrik Brautaset Aronsen <subsurface@henrik.synth.no> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-23Move more dive computer filled data to the divecomputer structureGravatar Linus Torvalds
This moves the fields 'duration', 'surfacetime', 'maxdepth', 'meandepth', 'airtemp', 'watertemp', 'salinity' and 'surface_pressure' to the per-divecomputer data structure. They are filled in by the dive computer, and normally not edited. NOTE! All actual *use* of this data was then changed from dive->field to dive->dc.field programmatically with a shell-script and sed, and the result then edited for details. So while the XML save and restore code has been updated, all the displaying etc will currently always just show the first dive computer entry. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-16Add GFlow/GFhigh settings in dive plannerGravatar Dirk Hohndel
The planner interactively responds to changes to the GFlow and GFhigh in the dialog and calculates an appropriate profile. If there is a previous dive within the 48 hours prior to this dive then its saturation is correctly taken into account if the gradient factors are changed - so if they are aggressively lowered it is possible to start the dive with already an existing ceiling (simply increase the surface interval to 'fix' that). Once the plan is accepted the GF values are reset to the current preferences. This can cause the ceiling in the plot to change and the deco stops to no longer match the ceiling - but that's a logical consequence of the ability to change a temporary copy of GFlow/GFhigh during the planning process and not the actual preferences (which would be counter intuitive, I think). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-16Correctly mark divelist changed after accepting dive planGravatar Dirk Hohndel
Commit 293126257b20 ("Mark divelist as changed if user accepts planned dive") had the correct commit message but an incorrect implementation. This moves the mark_divelist_changed() call into the GTK_RESPONSE_ACCEPT clause where it belongs. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15Mark divelist as changed if user accepts planned diveGravatar Dirk Hohndel
When the user clicks OK in the dive planner and the dive is added to the divelist the divelist needs to be marked as changed so Subsurface prompts the user to save the file before quitting. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15Calculate the gas used during the planned diveGravatar Dirk Hohndel
This works on the assumption that the diver uses the deco SAC rate while on a calculated deco stop and the bottom SAC rate during the rest of the dive (including the time they move from deco stop to deco stop). This is making the planning function mostly useful for open circuit diving. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15Add diveplan to the dive notesGravatar Dirk Hohndel
This makes it easy to print out a dive plan - it's simply stored in the notes of the simulated dive we create. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15Add code to enter SAC rates for dive planningGravatar Dirk Hohndel
This just provides the infrastructure to enter the data, nothing is calculated, yet. This adds a new get_thousandths() helper function so we can enter information of the 'mili-' type as decimal values. So things like "14.5 l/min" or "0.75 cuft/min" are parsed correctly and converted into a ml value. In the process of implementing that I also fixed a bug introduced in commit ab7aecf16e96 ("Simplify dive planning code") which broke the get_tenth() function. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15Add small helper function to make planner gui function easier to readGravatar Dirk Hohndel
This is just preparation for the next set of changes. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>