aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2021-08-18update Changelog and user manualGravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-18profile: use undo infrastructure for editing nicknamesGravatar Dirk Hohndel
This does the right thing even when removing a nickname by setting it to an empty string. The oddly named DiveListNotifier handles the need to redraw the profile when the name changes. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-18undo/device: adjust device management infrastructureGravatar Dirk Hohndel
We no longer need the remove infrastructure, and the edit nickname function becomes much more intuitive to use by passing in the dive computer for which we want to create a nickname instead of the internal index into the array of devices. This also removes / simplifies the device list update signals in the DiveListNotifier. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-18core: add get_or_add helper for dc tableGravatar Dirk Hohndel
This makes it much easier to manipulate dc nickname entries. In order for that to work we can't simply remove entries with empty nickname (but that isn't needed, anyway, as the code that saves XML or git already handles that case correctly). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-18Don't share dive computer data allocationsGravatar Linus Torvalds
... it just causes problems later when we free them, since we don't do any reference counting. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-18WIP profile: add UI to edit dc nicknameGravatar Dirk Hohndel
This is just a quick first implementation - it will need to use the undo code in the future, but for now this is a reasonable first step. It's also missing the code to redraw the profile with the updated DC name. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-18Update the serial number and deviceid in sync when loadingGravatar Linus Torvalds
When we save the divecomputer data, we never actually save the serial value as a field. We used to rely on saving the very dodgy 'deviceid', and then look up the serial number from there. And that never really worked reliably, but we didn't really notice, because we never really _used_ the serial number anywhere. The only place the serial number is actually reliably displayed is in the "Extra data" tab, which contains the key value pairs, and that's where the original dive download code got the serial number from. So just parse that at load time too, the same way we parsed it at dive download time. In fact, do the firmware version the same way, and remove the code from the downloader, since it too can rely on 'add_extra_data()' just picking up the information directly. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-18Add (nonfunctional) dive computer rename hooksGravatar Linus Torvalds
This adds the menu item to rename a dive computer (ie create a nickname for it) when right-clicking on the dive computer name of a dive computer that has a serial number (indicated by having a non-zero ->deviceid). It is nonfunctional because it's really just the skeleton code: it needs the UI to actually ask for a new nickname, and then it needs to actually do the proper "create_device_node(model,serial,nickname)" to set it (or remove the nickname if empty). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-18Remove the divecomputermodel codeGravatar Linus Torvalds
This is no longer reachable, since the divecomputer tab is gone. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-18Remove the divecomputer naming tabGravatar Linus Torvalds
The TabDiveComputer model won't work in the new world order, where you can't even insert a new device entry without a nickname to be edited. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-18Clean up divecomputer 'device' handlingGravatar Linus Torvalds
We have this odd legacy notion of a divecomputer 'device', that was originally just basically the libdivecomputer 'EVENT_DEVINFO' report that was associated with each dive. So it had firmware version, deviceid, and serial number. It had also gotten extended to do 'nickname' handling, and it was all confusing, ugly and bad. It was particularly bad because it wasn't actually a 'per device' thing at all: due to the firmware field, a dive computer that got a firmware update forced a new 'device'. To make matters worse, the 'deviceid' was also almost random, because we've calculated it a couple of different ways, and libdivecomputer itself has changed how the legacy 32-bit 'serial number' is expressed. Finally, because of all these issues, we didn't even try to make the thing unique, so it really ended up being a random snapshot of the state of the dive computer at the time of a dive, and sometimes we'd pick one, and sometimes another, since they weren't really well-defined. So get rid of all this confusion. The new rules: - the actual random dive computer state at the time of a dive is kept in the dive data. So if you want to know the firmware version, it should be in the 'extra data' - the only serial number that matters is the string one in the extra data, because that's the one that actually matches what the dive computer reports, and isn't some random 32-bit integer with ambiguous formatting. - the 'device id' - the thing we match with (together with the model name, eg "Suunto EON Steel") is purely a hash of the real serial number. The device ID that libdivecomputer reports in EVENT_DEVINFO is ignored, as is the device ID we've saved in the XML or git files. If we have a serial number, the device ID will be uniquely associated with that serial number, and if we don't have one, the device ID will be zero (for 'match anything'). So now 'deviceid' is literally just a shorthand for the serial number string, and the two are joined at the hip. - the 'device' managament is _only_ used to track devices that have serial numbers _and_ nicknames. So no more different device structures just because one had a nickname and the other didn't etc. Without a serial number, the device is 'anonymous' and fundamentally cannot be distinguished from other devices of the same model, so a nickname is meaningless. And without a nickname, there is no point in creating a device data structure, since all the data is in the dive itself and the device structure wouldn't add any value.. These rules mean that we no longer have ambiguous 'device' structures, and we can never have duplicates that can confuse us. This does mean that you can't give a nickname to a device that cannot be uniquely identified with a serial number, but those are happily fairly rare (and mostly older ones). Dirk said he'd look at what it takes to give more dive computers proper serial numbers, and I already did it for the Garmin Descent family yesterday. (Honesty in advertizing: right now you can't add a nickname to a dive computer that doesn't already have one, because such a dive computer will not have a device structure. But that's a UI issue, and I'll sort that out separately) Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2021-08-16update libdivecomputerGravatar Dirk Hohndel
Garmin: add extra-info for serial number and firmware version Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-16desktop: avoid crash when changing dive logsGravatar Dirk Hohndel
If the last displayed dive had events, those DiveEventItems had slots connected that would update those icons if things changed. When closing the dive log and switching to a different one, those slots were still called and would then access freed memory (the event structure from that old dive that is long gone by then). This code explicitly deletes those DiveEventItems which also removes those signal slot connections. Fixes #3305 Sugested-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-15core: add downloaded GPS to existing dive siteGravatar Dirk Hohndel
If we download a first dive computer and add a dive site to the dive (by setting a location name for example), and then download from another dive computer that provides us with GPS data, we should keep the existing dive site information, but add the GPS data from the freshly downloaded dive computer. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-08-12desktop: fix crash when right-clicking of trip headersGravatar Berthold Stoeger
Commit e42fc1a1e9a13c77d3474dbcb26b68b8772b8c6d introduced a crash condition. Apparently the code attempts to test whether the clicked-on item is a top-level dive. The "Collapse others" menu item should not be shown in that case. It does this by testing "d->divetrip". However, "d" might quite logically be null if clicking on an unexpanded trip header. Therefore, check explicitly for the trip header case (which should show the menu item) and for good measure prevent the nullpointer access (that should be caught by testing for trip, but who knows). Fixes #3301. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-08-06export: clean up temp file after divelogs.de uploadGravatar Richard Fuchs
This adds a cleanup function to be called after a divelogs.de upload finishes (successful or not) to make sure the temporary zip file is closed and removed. Signed-off-by: Richard Fuchs <dfx@dfx.at>
2021-08-03export: use unique temporary file for divelogs.de uploadGravatar Richard Fuchs
On multi-user systems with a shared directory for temporary files, using a static file name can lead to permissions problems and subsequent errors due to collisions. Use a random unique file name for each generated file to avoid these problems. Note: the temporary file generated from the divelogs.de upload is still left behind after the upload finishes. Signed-off-by: Richard Fuchs <dfx@dfx.at>
2021-07-30cleanup: remove DiveCalculatedCeiling::profileWidgetGravatar Berthold Stoeger
The DiveCalculatedCeiling had a back-pointer to the profileWidget. This was used for weird control-flow shenanigans, which were removed in 975c123a30de95eafd9b3c2ce2a625a1d05a79dc. Remove this now useless member variable. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-30cleanup: unify the ProfileWidget2::shouldCalculateMax* variablesGravatar Berthold Stoeger
The shouldCalcluateMaxTime and shouldCalculateMaxDepth member variables of ProfileWidget2 are set to false during drag-mode to avoid strange shrinking of the graph. They always adopt the same value. Therefore, replace by a single shouldCalculateMax boolean. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-28mobile: update version to 3.2.1Gravatar Dirk Hohndel
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-28build-system: fail with Qt6Gravatar Dirk Hohndel
I thought that explicitly requesting Qt5 should be enough, but we have a report from a user who tried to build against Qt6 and cmake happily let them proceed. So let's fail this explicitly. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23changelog: add summary of recent changesGravatar Dirk Hohndel
First step towards doing another release. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23core/import: fix string check logicGravatar Dirk Hohndel
The intent of the code was to check that there is a string and it has at least two characters. Since iter is the result of a strchr(iter, '|') call, we know that if iter isn't NULL, iter[0] is '|', so we only need to check the next character. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23core/csv-import: don't do pointer math after reallocGravatar Dirk Hohndel
try_to_xslt_open_csv() re-allocates the memory passed in (not really great as far as design goes, maybe something that should be reimplemented). Doing pointer arithmatic with the returned base pointer results in garbage, unless one gets super lucky and the realloc manages to not move the memory. It's a wonder this ever worked. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23core: always create a fake profile if there are no samplesGravatar Berthold Stoeger
Before making the cylinder-table dynamic, dives always had at least one cylinger. When such a dive is displayed, the TabDiveInformation class calls per_cylinder_mean_depth(). If there are no samples, this function generates a "fake profile" with fake_dc(). Thus, effectively dives always had samples once the user was displaying them. When the cylinder-table was made dynamic, dives without cylinders were supported. This can notably happen, when importing from CSV (this could actually be a bug). per_cylinder_mean_depth() exits early in that case and doesn't create a fake profile. This lead to crashes of the profile-widget, which were fixed in 6b2e56e5131. Non-sample dives were now shown with the Subsurface-logo. To restore the previous behavior, genarate a fake profile for sample-less dives in fixup_dive(), which is called anytime a dive is loaded or imported. This seems to have been the intention anyway and this worked only "by chance". This will make a few fake_dc() calls obsolete, but so be it. Since fake profiles are now generated on loading, the parse-tests need to be fixed to account for that. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23tests: initialize our prefs to the default valuesGravatar Dirk Hohndel
Otherwise we end up with nonsensical values which lead to a division by zero, which in return leads to different results, depending on platform. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-23core: recalculate CNS values on mergeGravatar Berthold Stoeger
When merging two dives, the higher CNS value was taken. This could result in inconsistent CNS values if two dives were merged where one dive's CNS was calculated from a "fake profile", i.e. a dive without dive-computer profile. In that case, the most conservative value (all time spent at the bottom) was assumed. The merged dive then consisted of the dive-computer profile and the conservative CNS estimate. This is fixed by setting the CNS value to "0" after merging, which means "unknown". The correct value will then be recalculated in "fixup_dive" from the actual sample data. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23cleanup: don't NUL-terminate membuffer in uploadDiveLogsDEGravatar Berthold Stoeger
The data of the membuffer is passed as a data/length pair to xmlReadMemory(). There is no point in NUL-terminating it. Moreover, pass the data directly to xmlReadMemory() instead of via variables. These variables are reused later with a different meaning, making this super-confusing. The membuf variable is turned from "const char *" to "char *" to signal that we own the buffer. Amazingly, zip_source_buffer() frees the buffer, even though a "const void *" is passed in. This API is pure madness. Add a comment. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23cleanup: replace membuffer by qasprintf_loc()Gravatar Berthold Stoeger
There is a function to format QString with C-format strings. Let's use it instead of doing a detour via membuffer. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23cleanup: replace membuffer by membufferpp in C-codeGravatar Berthold Stoeger
Thus, the membuffer data is automatically freed when going out of scope - one thing less to worry about. This fixes one use-after-free bug in uploadDiveLogsDE.cpp and one extremely questionable practice in divetooltipitem.cpp: The membuffer was a shared instance across all instances of the DiveToolTipItem. Remves unnecessary #include directives in files that didn't even use membuffer. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23core: C++-ify membufferGravatar Berthold Stoeger
C-style memory management is a pain and nearly nobody seems to get it right. Add a C++-version of membuffer that frees the buffer when it gets out-of-scope. Originally, I was thinking about conditionally adding a constructor/destructor pair when compiling with C++. But then decided to create a derived class membufferpp, because it would be extremely confusing to have behavioral change when changing a source from from C to C++ or vice-versa. Also add a comment about the dangers of returned pointer: They become dangling on changes to the membuffer. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23core: use int16_t for sensor-idGravatar Berthold Stoeger
The sensor-id in the sample struct was a uint8_t, with all the known problems of unsigned integers. In the rest of the code cylinder ids are signed integers. To avoid confusion, make it a signed int. int8_t should be enough (max. 127 cylinders). To allow for degenerate cases, use an int16_t. 16k cylinders should be enough for everyone. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-23desktop: explicitly enable shortcutsGravatar Dirk Hohndel
The changes in commit 4daf687876 ("profile: remove [disable|enable]Shortcuts() signals") resulted in us no longer enabling the shortcuts on the desktop (at least on macOS where I debugged this). This placement of the call feels like a bit of overkill, but at least it shouldn't be wrong. Fixes #3293 Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-20Update libdivecomputerGravatar Dirk Hohndel
- fix potential crash with Garmin Descent Mk2 - fix HW Sport and Mares Genius firmware update - Various parser updates: - sporasub depth, salinity and sample rate parsing - Atomics Cobalt atmospheric pressure parsing - unit cleanups (Uwatec, McLean Extreme) Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-20core/ble: add auto detection for Aladin A2Gravatar Dirk Hohndel
This way it will be recognized as a dive computer when it is scanned via BLE. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-20cleanup: remove function static variablesGravatar Berthold Stoeger
There were two function-static variables in ToolTipItem::refresh(), which is a very scary proposition. Curently, there is only one ToolTipItem, but this may change on mobile, where there are multiple profiles at the same time. Remove this timebomb and make the two objects subobjects. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-19core: sanitize pressure-sensor cylinder ids in fixup_dive()Gravatar Berthold Stoeger
The code will happily perform out-of-bound accesses if pressure-sensors refer to non-existing cylinders. Therefore, sanitize these values in fixup_dive(), which is called everytime a dive is loaded or imported. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-19parser: don't create samples with invalid cylinder idsGravatar Berthold Stoeger
By default, the parser would create samples with cylinder ids 0 and 1. This creates out-of-bound accesses for the common one-cylinder (or even no-cylinder) dives. These were harmless when the cylinder-table was of a fixed size. Since changing to a dynamic cylinder-table, these became actual out-of-bound accesses. Don't create such samples in the parser. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-19core: add a special NO_SENSOR value for sample::sensorGravatar Berthold Stoeger
The sensor member of sample refers to a cylinder from which the pressure was read. However, some dives don't even have a cylinder. Therefore, introduce a special NO_SENSOR value for these dives. Since the cylinder is given as a uint8_t, 0xff seems to be a sensible choice. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-19Fix coverity reported memory leaksGravatar Miika Turkia
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2021-07-18Export unused cylinders to divelogs.deGravatar Miika Turkia
When user has selected to show unused cylinders in equipment tab, respect this setting when exporting to divelogs.de. Fixes #3277 Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
2021-07-11printing: remote incorrect scaling of event iconsGravatar Dirk Hohndel
It appears that this well intended change in commit 52aa7d83b6 ("Increase event icon size in print mode") actually causes the scaling of the event icons to be generally wrong. This removes the hard 4* scaling and also adds some debugging output in verbose mode. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-07cleanup: remove Printer::dpi member variableGravatar Berthold Stoeger
This variable is not used outside a single function, where it is reset every time the function runs. This can be realized by a function-local variable just as well. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-05snap: push regular updates of dependencies to stableGravatar Dirk Hohndel
We simply don't use release candidates in Subsurface these days, and no one then moves these builds to stable after testing, so stable has been getting stale while the builds that people SHOULD use have been sitting in candidate. Of course, this will only become the default after our next release (as I don't want four digit versions in a release build, so I can't simply add this to our snap-stable branch). Oh well - 5.0.3 will happen soon, given the print resolution issue for icons. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-04profile: scale dive event items according to font print scaleGravatar Berthold Stoeger
When printing with low DPI, the dive event items become comically large, because they are not resized like the fonts. Therefore, scale using the fontPrintScale. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-03Handle dives with no samplesGravatar Robert C. Helling
This occurs upon importing dives for example via CSV. Make sure the profile display is cleared when selecting such a dive rather than showing a different dive. Allow editing the profile for such a dive. Signed-off-by: Robert C. Helling <helling@atdotde.de>
2021-07-03Update translation source stringsGravatar Dirk Hohndel
And update all the translated copyright notices. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-07-03profile: remove ProfileWidget2::ItemsGravatar Berthold Stoeger
This enum was an artifact from the primordial days of the profile widget. As far as I can see it was never used. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-03profile: rename ADD state to EDIT stateGravatar Berthold Stoeger
The ADD state is not used for adding dives since adding dives was made undoable. Therefore, rename it to EDIT state, since that is what it is used for. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2021-07-03cleanup: remove lost comment in profilewidget2.hGravatar Berthold Stoeger
Clearly, this comment got lost in code reshuffling, as it comments about ADD and PLAN mode, but is in front of picture declarations. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>