This is the official upstream of the Subsurface divelog program
Find a file
Linus Torvalds e1b880f444 Profile support for multiple concurrent pressure sensors
This finally handles multiple cylinder pressures, both overlapping and
consecutive, and it seems to work on the nasty cases I've thrown at it.

Want to just track five different cylinders all at once, without any
pesky gas switch events? Sure, you can do that.  It will show five
different gas pressures for your five cylinders, and they will go down
as you breathe down the cylinders.

I obviously don't have any real data for that case, but I do have a test
file with five actual cylinders that all have samples over the whole
course of the dive.  The end result looks messy as hell, but what did
you expect?

HOWEVER.

The only way to do this sanely was

 - actually make the "struct plot_info" have all the cylinder pressures
   (so no "sensor index and pressure" - every cylinder has a pressure for
   every plot info entry)

   This obviously makes the plot_info much bigger. We used to have
   MAX_CYLINDERS be a fairly generous 8, which seems sane. The planning
   code made that 8 be 20. That seems questionable. But whatever.

   The good news is that the plot-info should hopefully get freed, and
   only be allocated one dive at a time, so the fact that it is big and
   nasty shouldn't be a scaling issue, though.

 - the "populate_pressure_information()" function had to be rewritten
   quite a bit. The good news is that it's actually simpler now, although
   I would not go so far as to really call it simple. It's still
   complicated and suble, but now it explicitly just does one cylinder at
   a time.

   It *used* to have this insanely complicated "keep track of the pressure
   ranges for every cylinder at once". I just couldn't stand that model
   and keep my sanity, so it now just tracks one cylinder at a time, and
   doesn't have an array of live data, instead the caller will just call
   it for each cylinder.

 - get rid of some of our hackier stuff, like the code that populates the
   plot_info data code with the currently selected cylinder number, and
   clears out any other pressures. That obviously does *not* work when you
   may not have a single primary cylinder any more.

Now, the above sounds like all good things. Yeah, it mostly is.

BUT.

There's a few big downsides from the above:

 - there's no sane way to do this as a series of small changes.

   The change to make the plot_info take an array of cylinder pressures
   rather than the sensor+pressure model really isn't amenable to "fix up
   one use at a time". When you switch over to the new data structure
   model, you have to switch over to the new way of populating the
   pressure ranges. The two just go hand in hand.

 - Some of our code *depended* on the "sensor+pressure" model. I fixed all
   the ones I could sanely fix. There was one particular case that I just
   couldn't sanely fix, and I didn't care enough about it to do something
   insane.

   So the only _known_ breakage is the "TankItem" profile widget. That's
   the bar at the bottom of the profile that shows which cylinder is in
   use right now. You'd think that would be trivial to fix up, and yes it
   would be - I could just use the regular model of

     firstcyl = explicit_first_cylinder(dive, dc)
     .. then iterate over the gas change events to see the others ..

   but the problem with the "TankItem" widget is that it does its own
   model, and it has thrown away the dive and the dive computer
   information. It just doesn't even know. It only knows what cylinders
   there are, and the plot_info. And it just used to look at the sensor
   number in the plot_info, and be done with that. That number no longer
   exists.

 - I have tested it, and I think the code is better, but hey, it's a
   fairly large patch to some of the more complex code in our code base.
   That "interpolate missing pressure fields" code really isn't pretty. It
   may be prettier, but..

Anyway, without further ado, here's the patch. No sign-off yet, because I
do think people should look and comment. But I think the patch is fine,
and I'll fix anythign that anybody can find, *except* for that TankItem
thing that I will refuse to touch. That class is ugly. It needs to have
access to the actual dive.

Note how it actually does remove more lines than it adds, and that's
despite added comments etc. The code really is simpler, but there may be
cases in there that need more work.

Known missing pieces that don't currently take advantage of concurrent
cylinder pressure data:

 - the momentary SAC rate coloring for dives will need more work

 - dive merging (but we expect to generally normally not merge dive
   computers, which is the main source of sensor data)

 - actually taking advantage of different sensor data from different
   dive computers

But most of all: Testing.  Lots and lots of testing to find all the
corner cases.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-07-27 14:45:58 -07:00
.tx Add simple glossary 2013-12-29 10:34:12 -08:00
android Android build: remove references to ministro stuff 2017-05-27 07:09:27 -07:00
android-mobile Android: add Suunto EON Steel as device 2017-07-03 15:05:45 -07:00
appdata dive master > divemaster 2017-03-04 12:08:17 -08:00
cmake/Modules Subsurface-mobile version jump to 2.0 2017-07-03 21:58:26 -07:00
core Profile support for multiple concurrent pressure sensors 2017-07-27 14:45:58 -07:00
desktop-widgets Fix slot handling in Photos tab 2017-07-12 08:25:58 -07:00
dives Fix TestParse to handle CCR import properly 2017-07-24 10:03:07 +09:00
Documentation French documentation translation 2017-07-11 22:18:00 +09:00
icons QML UI: better icon for download from dive computer 2017-07-08 10:29:10 -07:00
marbledata Add 1x1 transparent png to replace missing marble data 2015-07-09 16:38:36 -07:00
mobile-widgets QML UI: remove obsolete debugging code 2017-07-26 06:31:14 -07:00
packaging iOS build: add BLE support files 2017-07-19 06:21:23 -07:00
printing_templates Use abbreviations with dots. 2017-03-11 08:09:07 -08:00
profile-widget Profile support for multiple concurrent pressure sensors 2017-07-27 14:45:58 -07:00
qt-models Profile support for multiple concurrent pressure sensors 2017-07-27 14:45:58 -07:00
ReleaseNotes Another ReleaseNotes update 2017-04-22 12:49:30 -07:00
scripts Merge branch 'MobileUI' of git://github.com/jbygdell/subsurface 2017-07-17 07:39:48 -07:00
smtk-import smtk-import: partially revert and complete 6963b52d 2017-06-22 10:40:04 +09:00
tests TestPreferences: Fix update manager test date 2017-07-04 11:54:54 +09:00
theme Use abbreviations with dots. 2017-03-11 08:09:07 -08:00
translations Latest translations 2017-07-11 21:21:11 -07:00
xslt Fix CSV export for imperial start and end pressure 2017-07-15 14:44:07 +09:00
.clang-format Reenable ForEachMacros in .clang-format 2015-10-19 07:37:05 -07:00
.gitattributes Flag more minified javascript as binary 2017-06-21 18:42:41 -07:00
.gitignore Move subsurface-core to core and qt-mobile to mobile-widgets 2016-04-04 22:33:58 -07:00
.mention-bot Mention bot: no comments 2017-04-20 15:58:30 -07:00
.travis.yml Upgrade 3pp for android and testing 2017-06-21 18:43:15 -07:00
CMakeLists.txt Mac build: correctly deal with no printing 2017-07-15 21:51:42 -07:00
CodingStyle CodingStype: add explanation how to install the QtCreator settings 2015-09-07 07:58:35 -07:00
descriptor3.tsv Add structured file with list of supported dive computers 2013-12-13 16:26:01 -08:00
export-html.cpp Add SPDX header to top level files 2017-04-29 13:32:55 -07:00
gpl-2.0.txt Add second copy of the GPL 2016-09-22 18:15:26 -07:00
INSTALL Change protocoll for any git clone from Github to https 2017-04-16 07:41:24 -07:00
LICENSE Move license file to LICENSE 2016-09-21 15:28:05 -07:00
qt-installer-noninteractive.qs Android build script: update for Qt 5.9 2017-05-31 10:16:29 -07:00
README Update README for 4.6.4 release 2017-04-26 18:46:25 +02:00
Readme.testing Information on writing test cases 2014-04-15 11:03:38 -07:00
Readme.ubuntu Update Readme.ubuntu 2015-01-15 19:48:11 -08:00
subsurface-desktop-helper.cpp Add SPDX header to top level files 2017-04-29 13:32:55 -07:00
subsurface-desktop-main.cpp Move the fill_computer_list() out of widgets 2017-05-27 08:07:35 -07:00
subsurface-mobile-helper.cpp QML UI: allow downloading from libdc simulator 2017-07-22 16:15:00 -07:00
subsurface-mobile-main.cpp Move the fill_computer_list() out of widgets 2017-05-27 08:07:35 -07:00
subsurface.debug Add subsurface.debug script to help debugging and install it (for Linux only) 2015-10-29 08:35:01 -07:00
subsurface.desktop Add a trailing ';' to the Keywords in the subsurface.desktop file 2014-12-22 15:55:04 -08:00
subsurface.qrc Build a gui for configure OSTC 4 2017-05-04 10:50:15 -07:00
subsurface_enabled_translations Added missing Qt5 translation files 2017-02-01 16:28:42 -08:00
subsurfacetemplate.tex Export to TeX file initialized 2016-10-11 22:00:08 -07:00
SupportedDivecomputers.html Update SupportedDivecomputers 2017-07-02 20:57:54 -07:00
SupportedDivecomputers.txt Update SupportedDivecomputers 2017-07-02 20:57:54 -07:00
terms PO₂ > pO₂ 2017-03-13 10:28:06 -07:00
TODO.CCR Update todo list for CCR 2014-11-18 13:15:43 +00:00

This is the README file for Subsurface 4.6.4

Please check the ReleaseNotes.txt for details about new features and
changes since Subsurface 4.6.3 (and earlier versions).

Subsurface can be found at http://subsurface-divelog.org

Our user forum is at http://subsurface-divelog.org/user-forum/
We also try to respond to questions in the ScubaBoard.com dive software
forum at http://www.scubaboard.com/forums/dive-software/

Report bugs and issues at
https://github.com/Subsurface-divelog/subsurface/issues

License: GPLv2

You can get the sources to the latest development version from the git
repository:

git clone https://github.com/Subsurface-divelog/subsurface.git

You can also fork the repository and browse the sources at the same site,
simply using https://github.com/Subsurface-divelog/subsurface

If you want the latest release (instead of the bleeding edge
development version) you can either get this via git or the release tar
ball. After cloning run the following command:

git checkout v4.6.4  (or whatever the last release is)

or download a tar ball from:

http://subsurface-divelog.org/downloads/Subsurface-4.6.4.tgz

Detailed build instructions can be found in the INSTALL file.

Basic Usage:
============

Install and start from the desktop, or you can run it locally from the
build directory:

On Linux:

$ ./subsurface

On Mac:

$ open Subsurface.app

Native builds on Windows are not really supported (the official Windows
installers are both cross-built on Linux).

You can give a data file as command line argument, or (once you have
set this up in the Preferences) Subsurface picks a default file for
you when started from the desktop or without an argument.

If you have a dive computer supported by libdivecomputer, you can just
select "Import from Divecomputer" from the "Import" menu, select which
dive computer you have (and where it is connected if you need to), and
hit "OK".

The latest list of supported dive computers can be found in the file
SupportedDivecomputers.txt.

Much more detailed end user instructions can be found from inside
Subsurface by selecting Help (typically F1). When building from source
this is also available as Documentation/user-manual.html. The
documentation for the latest release is also available on-line
http://subsurface-divelog.org/documentation/


Contributing:
=============

There is a mailing list for developers: subsurface@subsurface-divelog.org
Go to http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
to subscribe.

If you want to contribute code, please open a pull request with signed-off
commits at https://github.com/Subsurface-divelog/subsurface/pulls
(alternatively, you can also send your patches as emails to the developer
mailing lsit).

Either way, if you don't sign off your patches, we will not accept them.
This means adding a line that says "Signed-off-by: Name <email>" at the
end of each commit, indicating that you wrote the code and have the right
to pass it on as an open source patch.

See: http://developercertificate.org/

Also, please write good git commit messages.  A good commit message
looks like this:

	Header line: explain the commit in one line (use the imperative)

	Body of commit message is a few lines of text, explaining things
	in more detail, possibly giving some background about the issue
	being fixed, etc etc.

	The body of the commit message can be several paragraphs, and
	please do proper word-wrap and keep columns shorter than about
	74 characters or so. That way "git log" will show things
	nicely even when it's indented.

	Make sure you explain your solution and why you're doing what you're
	doing, as opposed to describing what you're doing. Reviewers and your
	future self can read the patch, but might not understand why a
	particular solution was implemented.

	Reported-by: whoever-reported-it
	Signed-off-by: Your Name <youremail@yourhost.com>

where that header line really should be meaningful, and really should be
just one line.  That header line is what is shown by tools like gitk and
shortlog, and should summarize the change in one readable line of text,
independently of the longer explanation. Please use verbs in the
imperative in the commit message, as in "Fix bug that...", "Add
file/feature ...", or "Make Subsurface..."


A bit of Subsurface history:
============================

In fall of 2011, when a forced lull in kernel development gave him an
opportunity to start on a new endeavor, Linus Torvalds decided to tackle
his frustration with the lack of decent divelog software on Linux.

Subsurface is the result of the work of him and a team of developers since
then. It now supports Linux, Windows and MacOS and allows data import from
a large number of dive computers and several existing divelog programs. It
provides advanced visualization of the key information provided by a
modern dive computer and allows the user to track a wide variety of data
about their diving.

In fall of 2012 Dirk Hohndel took over as maintainer of Subsurface.