mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: move cylinder related functions to struct dive
Seems natural in a C++ code base. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
3aab33ba4c
commit
1b593dc56c
29 changed files with 250 additions and 259 deletions
|
@ -198,7 +198,7 @@ void export_TeX(const char *filename, bool selected_only, bool plain, ExportCall
|
||||||
put_format(&buf, "\n%% Gas use information:\n");
|
put_format(&buf, "\n%% Gas use information:\n");
|
||||||
int qty_cyl = 0;
|
int qty_cyl = 0;
|
||||||
for (auto [i, cyl]: enumerated_range(dive->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(dive->cylinders)) {
|
||||||
if (is_cylinder_used(dive.get(), i) || (prefs.include_unused_tanks && !cyl.type.description.empty())){
|
if (dive->is_cylinder_used(i) || (prefs.include_unused_tanks && !cyl.type.description.empty())){
|
||||||
put_format(&buf, "\\def\\%scyl%cdescription{%s}\n", ssrf, 'a' + i, cyl.type.description.c_str());
|
put_format(&buf, "\\def\\%scyl%cdescription{%s}\n", ssrf, 'a' + i, cyl.type.description.c_str());
|
||||||
put_format(&buf, "\\def\\%scyl%cgasname{%s}\n", ssrf, 'a' + i, gasname(cyl.gasmix));
|
put_format(&buf, "\\def\\%scyl%cgasname{%s}\n", ssrf, 'a' + i, gasname(cyl.gasmix));
|
||||||
put_format(&buf, "\\def\\%scyl%cmixO2{%.1f\\%%}\n", ssrf, 'a' + i, get_o2(cyl.gasmix)/10.0);
|
put_format(&buf, "\\def\\%scyl%cmixO2{%.1f\\%%}\n", ssrf, 'a' + i, get_o2(cyl.gasmix)/10.0);
|
||||||
|
|
|
@ -1146,7 +1146,7 @@ EditCylinderBase::EditCylinderBase(int index, bool currentDiveOnly, bool nonProt
|
||||||
dives.clear();
|
dives.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const cylinder_t &orig = *get_cylinder(current, index);
|
const cylinder_t &orig = *current->get_cylinder(index);
|
||||||
|
|
||||||
std::vector<dive *> divesNew;
|
std::vector<dive *> divesNew;
|
||||||
divesNew.reserve(dives.size());
|
divesNew.reserve(dives.size());
|
||||||
|
@ -1156,7 +1156,7 @@ EditCylinderBase::EditCylinderBase(int index, bool currentDiveOnly, bool nonProt
|
||||||
for (dive *d: dives) {
|
for (dive *d: dives) {
|
||||||
if (index >= static_cast<int>(d->cylinders.size()))
|
if (index >= static_cast<int>(d->cylinders.size()))
|
||||||
continue;
|
continue;
|
||||||
if (nonProtectedOnly && is_cylinder_prot(d, index))
|
if (nonProtectedOnly && d->is_cylinder_prot(index))
|
||||||
continue;
|
continue;
|
||||||
// We checked that the cylinder exists above.
|
// We checked that the cylinder exists above.
|
||||||
const cylinder_t &cylinder = d->cylinders[index];
|
const cylinder_t &cylinder = d->cylinders[index];
|
||||||
|
@ -1272,7 +1272,7 @@ void EditCylinder::redo()
|
||||||
for (size_t i = 0; i < dives.size(); ++i) {
|
for (size_t i = 0; i < dives.size(); ++i) {
|
||||||
const std::string &name = cyl[i].type.description;
|
const std::string &name = cyl[i].type.description;
|
||||||
set_tank_info_data(tank_info_table, name, cyl[i].type.size, cyl[i].type.workingpressure);
|
set_tank_info_data(tank_info_table, name, cyl[i].type.size, cyl[i].type.workingpressure);
|
||||||
std::swap(*get_cylinder(dives[i], indexes[i]), cyl[i]);
|
std::swap(*dives[i]->get_cylinder(indexes[i]), cyl[i]);
|
||||||
divelog.dives.update_cylinder_related_info(*dives[i]);
|
divelog.dives.update_cylinder_related_info(*dives[i]);
|
||||||
emit diveListNotifier.cylinderEdited(dives[i], indexes[i]);
|
emit diveListNotifier.cylinderEdited(dives[i], indexes[i]);
|
||||||
invalidate_dive_cache(dives[i]); // Ensure that dive is written in git_save()
|
invalidate_dive_cache(dives[i]); // Ensure that dive is written in git_save()
|
||||||
|
|
|
@ -372,7 +372,7 @@ static char *dt_dive_parser(unsigned char *runner, struct dive *dt_dive, struct
|
||||||
*/
|
*/
|
||||||
read_bytes(2);
|
read_bytes(2);
|
||||||
if (tmp_2bytes != 0x7FFF && dt_dive->cylinders.size() > 0)
|
if (tmp_2bytes != 0x7FFF && dt_dive->cylinders.size() > 0)
|
||||||
get_cylinder(dt_dive, 0)->gas_used.mliter = lrint(get_cylinder(dt_dive, 0)->type.size.mliter * (tmp_2bytes / 100.0));
|
dt_dive->get_cylinder(0)->gas_used.mliter = lrint(dt_dive->get_cylinder(0)->type.size.mliter * (tmp_2bytes / 100.0));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dive Type 1 - Bit table. Subsurface don't have this record, but
|
* Dive Type 1 - Bit table. Subsurface don't have this record, but
|
||||||
|
@ -544,10 +544,10 @@ static char *dt_dive_parser(unsigned char *runner, struct dive *dt_dive, struct
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
if (is_nitrox && dt_dive->cylinders.size() > 0)
|
if (is_nitrox && dt_dive->cylinders.size() > 0)
|
||||||
get_cylinder(dt_dive, 0)->gasmix.o2.permille =
|
dt_dive->get_cylinder(0)->gasmix.o2.permille =
|
||||||
lrint(membuf[23] & 0x0F ? 20.0 + 2 * (membuf[23] & 0x0F) : 21.0) * 10;
|
lrint(membuf[23] & 0x0F ? 20.0 + 2 * (membuf[23] & 0x0F) : 21.0) * 10;
|
||||||
if (is_O2 && dt_dive->cylinders.size() > 0)
|
if (is_O2 && dt_dive->cylinders.size() > 0)
|
||||||
get_cylinder(dt_dive, 0)->gasmix.o2.permille = membuf[23] * 10;
|
dt_dive->get_cylinder(0)->gasmix.o2.permille = membuf[23] * 10;
|
||||||
free(compl_buffer);
|
free(compl_buffer);
|
||||||
}
|
}
|
||||||
JUMP(membuf, profile_length);
|
JUMP(membuf, profile_length);
|
||||||
|
@ -560,8 +560,8 @@ static char *dt_dive_parser(unsigned char *runner, struct dive *dt_dive, struct
|
||||||
else
|
else
|
||||||
dt_dive->dcs[0].deviceid = 0xffffffff;
|
dt_dive->dcs[0].deviceid = 0xffffffff;
|
||||||
if (!is_SCR && dt_dive->cylinders.size() > 0) {
|
if (!is_SCR && dt_dive->cylinders.size() > 0) {
|
||||||
get_cylinder(dt_dive, 0)->end.mbar = get_cylinder(dt_dive, 0)->start.mbar -
|
dt_dive->get_cylinder(0)->end.mbar = dt_dive->get_cylinder(0)->start.mbar -
|
||||||
((get_cylinder(dt_dive, 0)->gas_used.mliter / get_cylinder(dt_dive, 0)->type.size.mliter) * 1000);
|
((dt_dive->get_cylinder(0)->gas_used.mliter / dt_dive->get_cylinder(0)->type.size.mliter) * 1000);
|
||||||
}
|
}
|
||||||
return (char *)membuf;
|
return (char *)membuf;
|
||||||
bail:
|
bail:
|
||||||
|
@ -638,8 +638,8 @@ static void wlog_compl_parser(std::string &wl_mem, struct dive *dt_dive, int dco
|
||||||
*/
|
*/
|
||||||
tmp = (int) two_bytes_to_int(runner[pos_tank_init + 1], runner[pos_tank_init]);
|
tmp = (int) two_bytes_to_int(runner[pos_tank_init + 1], runner[pos_tank_init]);
|
||||||
if (tmp != 0x7fff) {
|
if (tmp != 0x7fff) {
|
||||||
get_cylinder(dt_dive, 0)->start.mbar = tmp * 10;
|
dt_dive->get_cylinder(0)->start.mbar = tmp * 10;
|
||||||
get_cylinder(dt_dive, 0)->end.mbar = get_cylinder(dt_dive, 0)->start.mbar - lrint(get_cylinder(dt_dive, 0)->gas_used.mliter / get_cylinder(dt_dive, 0)->type.size.mliter) * 1000;
|
dt_dive->get_cylinder(0)->end.mbar = dt_dive->get_cylinder(0)->start.mbar - lrint(dt_dive->get_cylinder(0)->gas_used.mliter / dt_dive->get_cylinder(0)->type.size.mliter) * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
177
core/dive.cpp
177
core/dive.cpp
|
@ -14,6 +14,7 @@
|
||||||
#include "divelist.h"
|
#include "divelist.h"
|
||||||
#include "divelog.h"
|
#include "divelog.h"
|
||||||
#include "divesite.h"
|
#include "divesite.h"
|
||||||
|
#include "equipment.h"
|
||||||
#include "errorhelper.h"
|
#include "errorhelper.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include "extradata.h"
|
#include "extradata.h"
|
||||||
|
@ -51,6 +52,19 @@ dive::dive(dive &&) = default;
|
||||||
dive &dive::operator=(const dive &) = default;
|
dive &dive::operator=(const dive &) = default;
|
||||||
dive::~dive() = default;
|
dive::~dive() = default;
|
||||||
|
|
||||||
|
/* get_cylinder_idx_by_use(): Find the index of the first cylinder with a particular CCR use type.
|
||||||
|
* The index returned corresponds to that of the first cylinder with a cylinder_use that
|
||||||
|
* equals the appropriate enum value [oxygen, diluent, bailout] given by cylinder_use_type.
|
||||||
|
* A negative number returned indicates that a match could not be found.
|
||||||
|
* Call parameters: dive = the dive being processed
|
||||||
|
* cylinder_use_type = an enum, one of {oxygen, diluent, bailout} */
|
||||||
|
static int get_cylinder_idx_by_use(const struct dive &dive, enum cylinderuse cylinder_use_type)
|
||||||
|
{
|
||||||
|
auto it = std::find_if(dive.cylinders.begin(), dive.cylinders.end(), [cylinder_use_type]
|
||||||
|
(auto &cyl) { return cyl.cylinder_use == cylinder_use_type; });
|
||||||
|
return it != dive.cylinders.end() ? it - dive.cylinders.begin() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The legacy format for sample pressures has a single pressure
|
* The legacy format for sample pressures has a single pressure
|
||||||
* for each sample that can have any sensor, plus a possible
|
* for each sample that can have any sensor, plus a possible
|
||||||
|
@ -66,7 +80,7 @@ int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer
|
||||||
{
|
{
|
||||||
int o2sensor;
|
int o2sensor;
|
||||||
|
|
||||||
o2sensor = (dc->divemode == CCR) ? get_cylinder_idx_by_use(dive, OXYGEN) : -1;
|
o2sensor = (dc->divemode == CCR) ? get_cylinder_idx_by_use(*dive, OXYGEN) : -1;
|
||||||
for (const auto &s: dc->samples) {
|
for (const auto &s: dc->samples) {
|
||||||
int seen_pressure = 0, idx;
|
int seen_pressure = 0, idx;
|
||||||
|
|
||||||
|
@ -92,11 +106,30 @@ int legacy_format_o2pressures(const struct dive *dive, const struct divecomputer
|
||||||
return o2sensor < 0 ? 256 : o2sensor;
|
return o2sensor < 0 ? 256 : o2sensor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* access to cylinders is controlled by two functions:
|
||||||
|
* - get_cylinder() returns the cylinder of a dive and supposes that
|
||||||
|
* the cylinder with the given index exists. If it doesn't, an error
|
||||||
|
* message is printed and the "surface air" cylinder returned.
|
||||||
|
* (NOTE: this MUST not be written into!).
|
||||||
|
* - get_or_create_cylinder() creates an empty cylinder if it doesn't exist.
|
||||||
|
* Multiple cylinders might be created if the index is bigger than the
|
||||||
|
* number of existing cylinders
|
||||||
|
*/
|
||||||
|
cylinder_t *dive::get_cylinder(int idx)
|
||||||
|
{
|
||||||
|
return &cylinders[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
const cylinder_t *dive::get_cylinder(int idx) const
|
||||||
|
{
|
||||||
|
return &cylinders[idx];
|
||||||
|
}
|
||||||
|
|
||||||
/* warning: does not test idx for validity */
|
/* warning: does not test idx for validity */
|
||||||
struct event create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
struct event create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx)
|
||||||
{
|
{
|
||||||
/* The gas switch event format is insane for historical reasons */
|
/* The gas switch event format is insane for historical reasons */
|
||||||
struct gasmix mix = get_cylinder(dive, idx)->gasmix;
|
struct gasmix mix = dive->get_cylinder(idx)->gasmix;
|
||||||
int o2 = get_o2(mix);
|
int o2 = get_o2(mix);
|
||||||
int he = get_he(mix);
|
int he = get_he(mix);
|
||||||
|
|
||||||
|
@ -124,13 +157,13 @@ void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int second
|
||||||
add_event_to_dc(dc, std::move(ev));
|
add_event_to_dc(dc, std::move(ev));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gasmix get_gasmix_from_event(const struct dive *dive, const struct event &ev)
|
struct gasmix dive::get_gasmix_from_event(const struct event &ev) const
|
||||||
{
|
{
|
||||||
if (ev.is_gaschange()) {
|
if (ev.is_gaschange()) {
|
||||||
int index = ev.gas.index;
|
int index = ev.gas.index;
|
||||||
// FIXME: The planner uses one past cylinder-count to signify "surface air". Remove in due course.
|
// FIXME: The planner uses one past cylinder-count to signify "surface air". Remove in due course.
|
||||||
if (index >= 0 && static_cast<size_t>(index) < dive->cylinders.size() + 1)
|
if (index >= 0 && static_cast<size_t>(index) < cylinders.size() + 1)
|
||||||
return get_cylinder(dive, index)->gasmix;
|
return get_cylinder(index)->gasmix;
|
||||||
return ev.gas.mix;
|
return ev.gas.mix;
|
||||||
}
|
}
|
||||||
return gasmix_air;
|
return gasmix_air;
|
||||||
|
@ -240,7 +273,7 @@ void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only)
|
||||||
|
|
||||||
d->cylinders.clear();
|
d->cylinders.clear();
|
||||||
for (auto [i, cyl]: enumerated_range(s->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(s->cylinders)) {
|
||||||
if (!used_only || is_cylinder_used(s, i) || get_cylinder(s, i)->cylinder_use == NOT_USED)
|
if (!used_only || s->is_cylinder_used(i) || s->get_cylinder(i)->cylinder_use == NOT_USED)
|
||||||
d->cylinders.push_back(cyl);
|
d->cylinders.push_back(cyl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -308,13 +341,39 @@ static int get_cylinder_used(const struct dive *dive, bool used[])
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the event has an explicit cylinder index,
|
||||||
|
* we return that. If it doesn't, we return the best
|
||||||
|
* match based on the gasmix.
|
||||||
|
*
|
||||||
|
* Some dive computers give cylinder indices, some
|
||||||
|
* give just the gas mix.
|
||||||
|
*/
|
||||||
|
int dive::get_cylinder_index(const struct event &ev) const
|
||||||
|
{
|
||||||
|
if (ev.gas.index >= 0)
|
||||||
|
return ev.gas.index;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This should no longer happen!
|
||||||
|
*
|
||||||
|
* We now match up gas change events with their cylinders at dive
|
||||||
|
* event fixup time.
|
||||||
|
*/
|
||||||
|
report_info("Still looking up cylinder based on gas mix in get_cylinder_index()!");
|
||||||
|
|
||||||
|
gasmix mix = get_gasmix_from_event(ev);
|
||||||
|
int best = find_best_gasmix_match(mix, cylinders);
|
||||||
|
return best < 0 ? 0 : best;
|
||||||
|
}
|
||||||
|
|
||||||
/* Are there any used cylinders which we do not know usage about? */
|
/* Are there any used cylinders which we do not know usage about? */
|
||||||
static bool has_unknown_used_cylinders(const struct dive *dive, const struct divecomputer *dc,
|
static bool has_unknown_used_cylinders(const struct dive &dive, const struct divecomputer *dc,
|
||||||
const bool used_cylinders[], int num)
|
const bool used_cylinders[], int num)
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
auto used_and_unknown = std::make_unique<bool[]>(dive->cylinders.size());
|
auto used_and_unknown = std::make_unique<bool[]>(dive.cylinders.size());
|
||||||
std::copy(used_cylinders, used_cylinders + dive->cylinders.size(), used_and_unknown.get());
|
std::copy(used_cylinders, used_cylinders + dive.cylinders.size(), used_and_unknown.get());
|
||||||
|
|
||||||
/* We know about using the O2 cylinder in a CCR dive */
|
/* We know about using the O2 cylinder in a CCR dive */
|
||||||
if (dc->divemode == CCR) {
|
if (dc->divemode == CCR) {
|
||||||
|
@ -326,7 +385,7 @@ static bool has_unknown_used_cylinders(const struct dive *dive, const struct div
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We know about the explicit first cylinder (or first) */
|
/* We know about the explicit first cylinder (or first) */
|
||||||
idx = explicit_first_cylinder(dive, dc);
|
idx = dive.explicit_first_cylinder(dc);
|
||||||
if (idx >= 0 && used_and_unknown[idx]) {
|
if (idx >= 0 && used_and_unknown[idx]) {
|
||||||
used_and_unknown[idx] = false;
|
used_and_unknown[idx] = false;
|
||||||
num--;
|
num--;
|
||||||
|
@ -336,7 +395,7 @@ static bool has_unknown_used_cylinders(const struct dive *dive, const struct div
|
||||||
event_loop loop("gaschange");
|
event_loop loop("gaschange");
|
||||||
const struct event *ev;
|
const struct event *ev;
|
||||||
while ((ev = loop.next(*dc)) != nullptr && num > 0) {
|
while ((ev = loop.next(*dc)) != nullptr && num > 0) {
|
||||||
idx = get_cylinder_index(dive, *ev);
|
idx = dive.get_cylinder_index(*ev);
|
||||||
if (idx >= 0 && used_and_unknown[idx]) {
|
if (idx >= 0 && used_and_unknown[idx]) {
|
||||||
used_and_unknown[idx] = false;
|
used_and_unknown[idx] = false;
|
||||||
num--;
|
num--;
|
||||||
|
@ -368,7 +427,7 @@ void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, i
|
||||||
*/
|
*/
|
||||||
auto used_cylinders = std::make_unique<bool[]>(dive->cylinders.size());
|
auto used_cylinders = std::make_unique<bool[]>(dive->cylinders.size());
|
||||||
num_used_cylinders = get_cylinder_used(dive, used_cylinders.get());
|
num_used_cylinders = get_cylinder_used(dive, used_cylinders.get());
|
||||||
if (has_unknown_used_cylinders(dive, dc, used_cylinders.get(), num_used_cylinders)) {
|
if (has_unknown_used_cylinders(*dive, dc, used_cylinders.get(), num_used_cylinders)) {
|
||||||
/*
|
/*
|
||||||
* If we had more than one used cylinder, but
|
* If we had more than one used cylinder, but
|
||||||
* do not know usage of them, we simply cannot
|
* do not know usage of them, we simply cannot
|
||||||
|
@ -401,7 +460,7 @@ void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, i
|
||||||
|
|
||||||
/* Make sure to move the event past 'lasttime' */
|
/* Make sure to move the event past 'lasttime' */
|
||||||
while (ev && lasttime >= ev->time.seconds) {
|
while (ev && lasttime >= ev->time.seconds) {
|
||||||
idx = get_cylinder_index(dive, *ev);
|
idx = dive->get_cylinder_index(*ev);
|
||||||
ev = loop.next(*dc);
|
ev = loop.next(*dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,19 +513,19 @@ static int same_rounded_pressure(pressure_t a, pressure_t b)
|
||||||
* first cylinder - in which case cylinder 0 is indeed the first cylinder.
|
* first cylinder - in which case cylinder 0 is indeed the first cylinder.
|
||||||
* We likewise return 0 if the event concerns a cylinder that doesn't exist.
|
* We likewise return 0 if the event concerns a cylinder that doesn't exist.
|
||||||
* If the dive has no cylinders, -1 is returned. */
|
* If the dive has no cylinders, -1 is returned. */
|
||||||
int explicit_first_cylinder(const struct dive *dive, const struct divecomputer *dc)
|
int dive::explicit_first_cylinder(const struct divecomputer *dc) const
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
if (dive->cylinders.empty())
|
if (cylinders.empty())
|
||||||
return -1;
|
return -1;
|
||||||
if (dc) {
|
if (dc) {
|
||||||
const struct event *ev = get_first_event(*dc, "gaschange");
|
const struct event *ev = get_first_event(*dc, "gaschange");
|
||||||
if (ev && ((!dc->samples.empty() && ev->time.seconds == dc->samples[0].time.seconds) || ev->time.seconds <= 1))
|
if (ev && ((!dc->samples.empty() && ev->time.seconds == dc->samples[0].time.seconds) || ev->time.seconds <= 1))
|
||||||
res = get_cylinder_index(dive, *ev);
|
res = get_cylinder_index(*ev);
|
||||||
else if (dc->divemode == CCR)
|
else if (dc->divemode == CCR)
|
||||||
res = std::max(get_cylinder_idx_by_use(dive, DILUENT), res);
|
res = std::max(get_cylinder_idx_by_use(*this, DILUENT), res);
|
||||||
}
|
}
|
||||||
return static_cast<size_t>(res) < dive->cylinders.size() ? res : 0;
|
return static_cast<size_t>(res) < cylinders.size() ? res : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double calculate_depth_to_mbarf(int depth, pressure_t surface_pressure, int salinity);
|
static double calculate_depth_to_mbarf(int depth, pressure_t surface_pressure, int salinity);
|
||||||
|
@ -492,13 +551,13 @@ void update_setpoint_events(const struct dive *dive, struct divecomputer *dc)
|
||||||
// pO2 values we would have computed anyway.
|
// pO2 values we would have computed anyway.
|
||||||
event_loop loop("gaschange");
|
event_loop loop("gaschange");
|
||||||
const struct event *ev = loop.next(*dc);
|
const struct event *ev = loop.next(*dc);
|
||||||
struct gasmix gasmix = get_gasmix_from_event(dive, *ev);
|
struct gasmix gasmix = dive->get_gasmix_from_event(*ev);
|
||||||
const struct event *next = loop.next(*dc);
|
const struct event *next = loop.next(*dc);
|
||||||
|
|
||||||
for (auto &sample: dc->samples) {
|
for (auto &sample: dc->samples) {
|
||||||
if (next && sample.time.seconds >= next->time.seconds) {
|
if (next && sample.time.seconds >= next->time.seconds) {
|
||||||
ev = next;
|
ev = next;
|
||||||
gasmix = get_gasmix_from_event(dive, *ev);
|
gasmix = dive->get_gasmix_from_event(*ev);
|
||||||
next = loop.next(*dc);
|
next = loop.next(*dc);
|
||||||
}
|
}
|
||||||
gas_pressures pressures = fill_pressures(lrint(calculate_depth_to_mbarf(sample.depth.mm, dc->surface_pressure, 0)), gasmix ,0, dc->divemode);
|
gas_pressures pressures = fill_pressures(lrint(calculate_depth_to_mbarf(sample.depth.mm, dc->surface_pressure, 0)), gasmix ,0, dc->divemode);
|
||||||
|
@ -1367,19 +1426,6 @@ pick_b:
|
||||||
add_initial_gaschange(d, res, offset, cylinders_map2[0]);
|
add_initial_gaschange(d, res, offset, cylinders_map2[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get_cylinder_idx_by_use(): Find the index of the first cylinder with a particular CCR use type.
|
|
||||||
* The index returned corresponds to that of the first cylinder with a cylinder_use that
|
|
||||||
* equals the appropriate enum value [oxygen, diluent, bailout] given by cylinder_use_type.
|
|
||||||
* A negative number returned indicates that a match could not be found.
|
|
||||||
* Call parameters: dive = the dive being processed
|
|
||||||
* cylinder_use_type = an enum, one of {oxygen, diluent, bailout} */
|
|
||||||
int get_cylinder_idx_by_use(const struct dive *dive, enum cylinderuse cylinder_use_type)
|
|
||||||
{
|
|
||||||
auto it = std::find_if(dive->cylinders.begin(), dive->cylinders.end(), [cylinder_use_type]
|
|
||||||
(auto &cyl) { return cyl.cylinder_use == cylinder_use_type; });
|
|
||||||
return it != dive->cylinders.end() ? it - dive->cylinders.begin() : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Force an initial gaschange event to the (old) gas #0 */
|
/* Force an initial gaschange event to the (old) gas #0 */
|
||||||
static void add_initial_gaschange(struct dive &dive, struct divecomputer &dc, int offset, int idx)
|
static void add_initial_gaschange(struct dive &dive, struct divecomputer &dc, int offset, int idx)
|
||||||
{
|
{
|
||||||
|
@ -1472,7 +1518,7 @@ int same_gasmix_cylinder(const cylinder_t &cyl, int cylid, const struct dive *di
|
||||||
if (i == cylid)
|
if (i == cylid)
|
||||||
continue;
|
continue;
|
||||||
struct gasmix gas2 = cyl.gasmix;
|
struct gasmix gas2 = cyl.gasmix;
|
||||||
if (gasmix_distance(mygas, gas2) == 0 && (is_cylinder_used(dive, i) || check_unused))
|
if (gasmix_distance(mygas, gas2) == 0 && (dive->is_cylinder_used(i) || check_unused))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1598,7 +1644,7 @@ static bool cylinder_in_use(const struct dive *dive, int idx)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* This tests for gaschange events or pressure changes */
|
/* This tests for gaschange events or pressure changes */
|
||||||
if (is_cylinder_used(dive, idx) || prefs.include_unused_tanks)
|
if (dive->is_cylinder_used(idx) || prefs.include_unused_tanks)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* This tests for typenames or gas contents */
|
/* This tests for typenames or gas contents */
|
||||||
|
@ -1660,7 +1706,7 @@ static void merge_cylinders(struct dive &res, const struct dive &a, const struct
|
||||||
if (!used_in_b[i])
|
if (!used_in_b[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
j = match_cylinder(get_cylinder(&b, i), res, try_to_match.get());
|
j = match_cylinder(b.get_cylinder(i), res, try_to_match.get());
|
||||||
|
|
||||||
/* No match? Add it to the result */
|
/* No match? Add it to the result */
|
||||||
if (j < 0) {
|
if (j < 0) {
|
||||||
|
@ -1672,7 +1718,7 @@ static void merge_cylinders(struct dive &res, const struct dive &a, const struct
|
||||||
|
|
||||||
/* Otherwise, merge the result to the one we found */
|
/* Otherwise, merge the result to the one we found */
|
||||||
mapping_b[i] = j;
|
mapping_b[i] = j;
|
||||||
merge_one_cylinder(get_cylinder(&res, j), get_cylinder(&b, i));
|
merge_one_cylinder(res.get_cylinder(j), b.get_cylinder(i));
|
||||||
|
|
||||||
/* Don't match the same target more than once */
|
/* Don't match the same target more than once */
|
||||||
try_to_match[j] = false;
|
try_to_match[j] = false;
|
||||||
|
@ -2589,8 +2635,8 @@ gasmix_loop::gasmix_loop(const struct dive &d, const struct divecomputer &dc) :
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* on first invocation, get initial gas mix and first event (if any) */
|
/* on first invocation, get initial gas mix and first event (if any) */
|
||||||
int cyl = explicit_first_cylinder(&dive, &dc);
|
int cyl = dive.explicit_first_cylinder(&dc);
|
||||||
last = get_cylinder(&dive, cyl)->gasmix;
|
last = dive.get_cylinder(cyl)->gasmix;
|
||||||
ev = loop.next(dc);
|
ev = loop.next(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2601,7 +2647,7 @@ gasmix gasmix_loop::next(int time)
|
||||||
return last;
|
return last;
|
||||||
|
|
||||||
while (ev && ev->time.seconds <= time) {
|
while (ev && ev->time.seconds <= time) {
|
||||||
last = get_gasmix_from_event(&dive, *ev);
|
last = dive.get_gasmix_from_event(*ev);
|
||||||
ev = loop.next(dc);
|
ev = loop.next(dc);
|
||||||
}
|
}
|
||||||
return last;
|
return last;
|
||||||
|
@ -2609,9 +2655,9 @@ gasmix gasmix_loop::next(int time)
|
||||||
|
|
||||||
/* get the gas at a certain time during the dive */
|
/* get the gas at a certain time during the dive */
|
||||||
/* If there is a gasswitch at that time, it returns the new gasmix */
|
/* If there is a gasswitch at that time, it returns the new gasmix */
|
||||||
struct gasmix get_gasmix_at_time(const struct dive &d, const struct divecomputer &dc, duration_t time)
|
struct gasmix dive::get_gasmix_at_time(const struct divecomputer &dc, duration_t time) const
|
||||||
{
|
{
|
||||||
return gasmix_loop(d, dc).next(time.seconds);
|
return gasmix_loop(*this, dc).next(time.seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Does that cylinder have any pressure readings? */
|
/* Does that cylinder have any pressure readings? */
|
||||||
|
@ -2682,7 +2728,7 @@ dive::get_maximal_gas_result dive::get_maximal_gas() const
|
||||||
int o2 = get_o2(cyl.gasmix);
|
int o2 = get_o2(cyl.gasmix);
|
||||||
int he = get_he(cyl.gasmix);
|
int he = get_he(cyl.gasmix);
|
||||||
|
|
||||||
if (!is_cylinder_used(this, i))
|
if (!is_cylinder_used(i))
|
||||||
continue;
|
continue;
|
||||||
if (cyl.cylinder_use == OXYGEN)
|
if (cyl.cylinder_use == OXYGEN)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2703,3 +2749,48 @@ dive::get_maximal_gas_result dive::get_maximal_gas() const
|
||||||
maxo2 = mino2 = 0;
|
maxo2 = mino2 = 0;
|
||||||
return { mino2, maxhe, maxo2 };
|
return { mino2, maxhe, maxo2 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool dive::has_gaschange_event(const struct divecomputer *dc, int idx) const
|
||||||
|
{
|
||||||
|
bool first_gas_explicit = false;
|
||||||
|
event_loop loop("gaschange");
|
||||||
|
while (auto event = loop.next(*dc)) {
|
||||||
|
if (!dc->samples.empty() && (event->time.seconds == 0 ||
|
||||||
|
(dc->samples[0].time.seconds == event->time.seconds)))
|
||||||
|
first_gas_explicit = true;
|
||||||
|
if (get_cylinder_index(*event) == idx)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !first_gas_explicit && idx == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dive::is_cylinder_used(int idx) const
|
||||||
|
{
|
||||||
|
if (idx < 0 || static_cast<size_t>(idx) >= cylinders.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const cylinder_t &cyl = cylinders[idx];
|
||||||
|
if ((cyl.start.mbar - cyl.end.mbar) > SOME_GAS)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ((cyl.sample_start.mbar - cyl.sample_end.mbar) > SOME_GAS)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (auto &dc: dcs) {
|
||||||
|
if (has_gaschange_event(&dc, idx))
|
||||||
|
return true;
|
||||||
|
else if (dc.divemode == CCR && idx == get_cylinder_idx_by_use(*this, OXYGEN))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dive::is_cylinder_prot(int idx) const
|
||||||
|
{
|
||||||
|
if (idx < 0 || static_cast<size_t>(idx) >= cylinders.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return std::any_of(dcs.begin(), dcs.end(),
|
||||||
|
[this, idx](auto &dc)
|
||||||
|
{ return has_gaschange_event(&dc, idx); });
|
||||||
|
}
|
||||||
|
|
20
core/dive.h
20
core/dive.h
|
@ -91,6 +91,15 @@ struct dive {
|
||||||
bool is_planned() const;
|
bool is_planned() const;
|
||||||
bool is_logged() const;
|
bool is_logged() const;
|
||||||
bool likely_same(const struct dive &b) const;
|
bool likely_same(const struct dive &b) const;
|
||||||
|
bool is_cylinder_used(int idx) const;
|
||||||
|
bool is_cylinder_prot(int idx) const;
|
||||||
|
int explicit_first_cylinder(const struct divecomputer *dc) const;
|
||||||
|
int get_cylinder_index(const struct event &ev) const;
|
||||||
|
bool has_gaschange_event(const struct divecomputer *dc, int idx) const;
|
||||||
|
struct gasmix get_gasmix_from_event(const struct event &ev) const;
|
||||||
|
struct gasmix get_gasmix_at_time(const struct divecomputer &dc, duration_t time) const;
|
||||||
|
cylinder_t *get_cylinder(int idx);
|
||||||
|
const cylinder_t *get_cylinder(int idx) const;
|
||||||
|
|
||||||
int depth_to_mbar(int depth) const;
|
int depth_to_mbar(int depth) const;
|
||||||
double depth_to_mbarf(int depth) const;
|
double depth_to_mbarf(int depth) const;
|
||||||
|
@ -115,7 +124,6 @@ struct dive_or_trip {
|
||||||
extern void invalidate_dive_cache(struct dive *dive);
|
extern void invalidate_dive_cache(struct dive *dive);
|
||||||
extern bool dive_cache_is_valid(const struct dive *dive);
|
extern bool dive_cache_is_valid(const struct dive *dive);
|
||||||
|
|
||||||
extern int get_cylinder_idx_by_use(const struct dive *dive, enum cylinderuse cylinder_use_type);
|
|
||||||
extern void cylinder_renumber(struct dive &dive, int mapping[]);
|
extern void cylinder_renumber(struct dive &dive, int mapping[]);
|
||||||
extern int same_gasmix_cylinder(const cylinder_t &cyl, int cylid, const struct dive *dive, bool check_unused);
|
extern int same_gasmix_cylinder(const cylinder_t &cyl, int cylid, const struct dive *dive, bool check_unused);
|
||||||
|
|
||||||
|
@ -139,9 +147,6 @@ struct dive_components {
|
||||||
unsigned int when : 1;
|
unsigned int when : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern bool has_gaschange_event(const struct dive *dive, const struct divecomputer *dc, int idx);
|
|
||||||
extern int explicit_first_cylinder(const struct dive *dive, const struct divecomputer *dc);
|
|
||||||
|
|
||||||
extern fraction_t best_o2(depth_t depth, const struct dive *dive, bool in_planner);
|
extern fraction_t best_o2(depth_t depth, const struct dive *dive, bool in_planner);
|
||||||
extern fraction_t best_he(depth_t depth, const struct dive *dive, bool o2narcotic, fraction_t fo2);
|
extern fraction_t best_he(depth_t depth, const struct dive *dive, bool o2narcotic, fraction_t fo2);
|
||||||
|
|
||||||
|
@ -193,13 +198,9 @@ extern int dive_getUniqID();
|
||||||
|
|
||||||
extern void copy_events_until(const struct dive *sd, struct dive *dd, int dcNr, int time);
|
extern void copy_events_until(const struct dive *sd, struct dive *dd, int dcNr, int time);
|
||||||
extern void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only);
|
extern void copy_used_cylinders(const struct dive *s, struct dive *d, bool used_only);
|
||||||
extern bool is_cylinder_used(const struct dive *dive, int idx);
|
|
||||||
extern bool is_cylinder_prot(const struct dive *dive, int idx);
|
|
||||||
extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx);
|
extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx);
|
||||||
extern struct event create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx);
|
extern struct event create_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx);
|
||||||
extern void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration);
|
extern void per_cylinder_mean_depth(const struct dive *dive, struct divecomputer *dc, int *mean, int *duration);
|
||||||
extern int get_cylinder_index(const struct dive *dive, const struct event &ev);
|
|
||||||
extern struct gasmix get_gasmix_from_event(const struct dive *, const struct event &ev);
|
|
||||||
extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id);
|
extern bool cylinder_with_sensor_sample(const struct dive *dive, int cylinder_id);
|
||||||
|
|
||||||
/* UI related protopypes */
|
/* UI related protopypes */
|
||||||
|
@ -208,9 +209,6 @@ extern void invalidate_dive_cache(struct dive *dc);
|
||||||
|
|
||||||
extern int total_weight(const struct dive *);
|
extern int total_weight(const struct dive *);
|
||||||
|
|
||||||
/* Get gasmix at a given time */
|
|
||||||
extern struct gasmix get_gasmix_at_time(const struct dive &dive, const struct divecomputer &dc, duration_t time);
|
|
||||||
|
|
||||||
extern void update_setpoint_events(const struct dive *dive, struct divecomputer *dc);
|
extern void update_setpoint_events(const struct dive *dive, struct divecomputer *dc);
|
||||||
|
|
||||||
/* Make pointers to dive and dive_trip "Qt metatypes" so that they can be passed through
|
/* Make pointers to dive and dive_trip "Qt metatypes" so that they can be passed through
|
||||||
|
|
|
@ -117,7 +117,7 @@ int total_weight(const struct dive *dive)
|
||||||
|
|
||||||
static int active_o2(const struct dive &dive, const struct divecomputer *dc, duration_t time)
|
static int active_o2(const struct dive &dive, const struct divecomputer *dc, duration_t time)
|
||||||
{
|
{
|
||||||
struct gasmix gas = get_gasmix_at_time(dive, *dc, time);
|
struct gasmix gas = dive.get_gasmix_at_time(*dc, time);
|
||||||
return get_o2(gas);
|
return get_o2(gas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,8 +137,8 @@ static int get_sample_o2(const struct dive &dive, const struct divecomputer *dc,
|
||||||
double amb_presure = dive.depth_to_bar(sample.depth.mm);
|
double amb_presure = dive.depth_to_bar(sample.depth.mm);
|
||||||
double pamb_pressure = dive.depth_to_bar(psample.depth.mm );
|
double pamb_pressure = dive.depth_to_bar(psample.depth.mm );
|
||||||
if (dc->divemode == PSCR) {
|
if (dc->divemode == PSCR) {
|
||||||
po2i = pscr_o2(pamb_pressure, get_gasmix_at_time(dive, *dc, psample.time));
|
po2i = pscr_o2(pamb_pressure, dive.get_gasmix_at_time(*dc, psample.time));
|
||||||
po2f = pscr_o2(amb_presure, get_gasmix_at_time(dive, *dc, sample.time));
|
po2f = pscr_o2(amb_presure, dive.get_gasmix_at_time(*dc, sample.time));
|
||||||
} else {
|
} else {
|
||||||
int o2 = active_o2(dive, dc, psample.time); // ... calculate po2 from depth and FiO2.
|
int o2 = active_o2(dive, dc, psample.time); // ... calculate po2 from depth and FiO2.
|
||||||
po2i = lrint(o2 * pamb_pressure); // (initial) po2 at start of segment
|
po2i = lrint(o2 * pamb_pressure); // (initial) po2 at start of segment
|
||||||
|
@ -182,8 +182,8 @@ static int calculate_otu(const struct dive &dive)
|
||||||
double amb_presure = dive.depth_to_bar(sample.depth.mm);
|
double amb_presure = dive.depth_to_bar(sample.depth.mm);
|
||||||
double pamb_pressure = dive.depth_to_bar(psample.depth.mm);
|
double pamb_pressure = dive.depth_to_bar(psample.depth.mm);
|
||||||
if (dc->divemode == PSCR) {
|
if (dc->divemode == PSCR) {
|
||||||
po2i = pscr_o2(pamb_pressure, get_gasmix_at_time(dive, *dc, psample.time));
|
po2i = pscr_o2(pamb_pressure, dive.get_gasmix_at_time(*dc, psample.time));
|
||||||
po2f = pscr_o2(amb_presure, get_gasmix_at_time(dive, *dc, sample.time));
|
po2f = pscr_o2(amb_presure, dive.get_gasmix_at_time(*dc, sample.time));
|
||||||
} else {
|
} else {
|
||||||
int o2 = active_o2(dive, dc, psample.time); // ... calculate po2 from depth and FiO2.
|
int o2 = active_o2(dive, dc, psample.time); // ... calculate po2 from depth and FiO2.
|
||||||
po2i = lrint(o2 * pamb_pressure); // (initial) po2 at start of segment
|
po2i = lrint(o2 * pamb_pressure); // (initial) po2 at start of segment
|
||||||
|
@ -388,7 +388,7 @@ static double calculate_airuse(const struct dive &dive)
|
||||||
// better not pretend we know the total gas use.
|
// better not pretend we know the total gas use.
|
||||||
// Eventually, logic should be fixed to compute average depth and total time
|
// Eventually, logic should be fixed to compute average depth and total time
|
||||||
// for those segments where cylinders with known pressure drop are breathed from.
|
// for those segments where cylinders with known pressure drop are breathed from.
|
||||||
if (is_cylinder_used(&dive, i))
|
if (dive.is_cylinder_used(i))
|
||||||
return 0.0;
|
return 0.0;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -369,25 +369,6 @@ cylinder_t *add_empty_cylinder(struct cylinder_table *t)
|
||||||
return &t->back();
|
return &t->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* access to cylinders is controlled by two functions:
|
|
||||||
* - get_cylinder() returns the cylinder of a dive and supposes that
|
|
||||||
* the cylinder with the given index exists. If it doesn't, an error
|
|
||||||
* message is printed and the "surface air" cylinder returned.
|
|
||||||
* (NOTE: this MUST not be written into!).
|
|
||||||
* - get_or_create_cylinder() creates an empty cylinder if it doesn't exist.
|
|
||||||
* Multiple cylinders might be created if the index is bigger than the
|
|
||||||
* number of existing cylinders
|
|
||||||
*/
|
|
||||||
cylinder_t *get_cylinder(struct dive *d, int idx)
|
|
||||||
{
|
|
||||||
return &d->cylinders[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
const cylinder_t *get_cylinder(const struct dive *d, int idx)
|
|
||||||
{
|
|
||||||
return &d->cylinders[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
cylinder_t *get_or_create_cylinder(struct dive *d, int idx)
|
cylinder_t *get_or_create_cylinder(struct dive *d, int idx)
|
||||||
{
|
{
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
|
@ -468,7 +449,7 @@ void add_default_cylinder(struct dive *d)
|
||||||
|
|
||||||
static bool show_cylinder(const struct dive *d, int i)
|
static bool show_cylinder(const struct dive *d, int i)
|
||||||
{
|
{
|
||||||
if (is_cylinder_used(d, i))
|
if (d->is_cylinder_used(i))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const cylinder_t &cyl = d->cylinders[i];
|
const cylinder_t &cyl = d->cylinders[i];
|
||||||
|
@ -499,7 +480,7 @@ void dump_cylinders(struct dive *dive, bool verbose)
|
||||||
{
|
{
|
||||||
printf("Cylinder list:\n");
|
printf("Cylinder list:\n");
|
||||||
for (int i = 0; i < dive->cylinders; i++) {
|
for (int i = 0; i < dive->cylinders; i++) {
|
||||||
cylinder_t *cyl = get_cylinder(dive, i);
|
cylinder_t *cyl = dive->get_cylinder(i);
|
||||||
|
|
||||||
printf("%02d: Type %s, %3.1fl, %3.0fbar\n", i, cyl->type.description.c_str(), cyl->type.size.mliter / 1000.0, cyl->type.workingpressure.mbar / 1000.0);
|
printf("%02d: Type %s, %3.1fl, %3.0fbar\n", i, cyl->type.description.c_str(), cyl->type.size.mliter / 1000.0, cyl->type.workingpressure.mbar / 1000.0);
|
||||||
printf(" Gasmix O2 %2.0f%% He %2.0f%%\n", cyl->gasmix.o2.permille / 10.0, cyl->gasmix.he.permille / 10.0);
|
printf(" Gasmix O2 %2.0f%% He %2.0f%%\n", cyl->gasmix.o2.permille / 10.0, cyl->gasmix.he.permille / 10.0);
|
||||||
|
|
|
@ -71,8 +71,6 @@ using weightsystem_table = std::vector<weightsystem_t>;
|
||||||
extern enum cylinderuse cylinderuse_from_text(const char *text);
|
extern enum cylinderuse cylinderuse_from_text(const char *text);
|
||||||
extern void copy_cylinder_types(const struct dive *s, struct dive *d);
|
extern void copy_cylinder_types(const struct dive *s, struct dive *d);
|
||||||
extern cylinder_t *add_empty_cylinder(struct cylinder_table *t);
|
extern cylinder_t *add_empty_cylinder(struct cylinder_table *t);
|
||||||
extern cylinder_t *get_cylinder(struct dive *d, int idx);
|
|
||||||
extern const cylinder_t *get_cylinder(const struct dive *d, int idx);
|
|
||||||
extern cylinder_t *get_or_create_cylinder(struct dive *d, int idx);
|
extern cylinder_t *get_or_create_cylinder(struct dive *d, int idx);
|
||||||
extern bool same_weightsystem(weightsystem_t w1, weightsystem_t w2);
|
extern bool same_weightsystem(weightsystem_t w1, weightsystem_t w2);
|
||||||
extern void remove_cylinder(struct dive *dive, int idx);
|
extern void remove_cylinder(struct dive *dive, int idx);
|
||||||
|
|
|
@ -187,7 +187,7 @@ static void fill_missing_tank_pressures(const struct dive *dive, struct plot_inf
|
||||||
if (track_pr.empty())
|
if (track_pr.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (get_cylinder(dive, cyl)->cylinder_use == OC_GAS)
|
if (dive->get_cylinder(cyl)->cylinder_use == OC_GAS)
|
||||||
strategy = SAC;
|
strategy = SAC;
|
||||||
else
|
else
|
||||||
strategy = TIME;
|
strategy = TIME;
|
||||||
|
@ -248,7 +248,7 @@ static void fill_missing_tank_pressures(const struct dive *dive, struct plot_inf
|
||||||
last_segment = it;
|
last_segment = it;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(get_cylinder(dive, cyl)->cylinder_use == OC_GAS) {
|
if(dive->get_cylinder(cyl)->cylinder_use == OC_GAS) {
|
||||||
|
|
||||||
/* if this segment has pressure_time, then calculate a new interpolated pressure */
|
/* if this segment has pressure_time, then calculate a new interpolated pressure */
|
||||||
if (interpolate.pressure_time) {
|
if (interpolate.pressure_time) {
|
||||||
|
@ -310,7 +310,7 @@ static void debug_print_pressures(struct plot_info &pi)
|
||||||
void populate_pressure_information(const struct dive *dive, const struct divecomputer *dc, struct plot_info &pi, int sensor)
|
void populate_pressure_information(const struct dive *dive, const struct divecomputer *dc, struct plot_info &pi, int sensor)
|
||||||
{
|
{
|
||||||
int first, last, cyl;
|
int first, last, cyl;
|
||||||
const cylinder_t *cylinder = get_cylinder(dive, sensor);
|
const cylinder_t *cylinder = dive->get_cylinder(sensor);
|
||||||
std::vector<pr_track_t> track;
|
std::vector<pr_track_t> track;
|
||||||
size_t current = std::string::npos;
|
size_t current = std::string::npos;
|
||||||
int missing_pr = 0, dense = 1;
|
int missing_pr = 0, dense = 1;
|
||||||
|
@ -350,7 +350,7 @@ void populate_pressure_information(const struct dive *dive, const struct divecom
|
||||||
*/
|
*/
|
||||||
cyl = sensor;
|
cyl = sensor;
|
||||||
event_loop loop_gas("gaschange");
|
event_loop loop_gas("gaschange");
|
||||||
const struct event *ev = has_gaschange_event(dive, dc, sensor) ?
|
const struct event *ev = dive->has_gaschange_event(dc, sensor) ?
|
||||||
loop_gas.next(*dc) : nullptr;
|
loop_gas.next(*dc) : nullptr;
|
||||||
divemode_loop loop_mode(*dc);
|
divemode_loop loop_mode(*dc);
|
||||||
|
|
||||||
|
@ -360,7 +360,7 @@ void populate_pressure_information(const struct dive *dive, const struct divecom
|
||||||
int time = entry.sec;
|
int time = entry.sec;
|
||||||
|
|
||||||
while (ev && ev->time.seconds <= time) { // Find 1st gaschange event after
|
while (ev && ev->time.seconds <= time) { // Find 1st gaschange event after
|
||||||
cyl = get_cylinder_index(dive, *ev); // the current gas change.
|
cyl = dive->get_cylinder_index(*ev); // the current gas change.
|
||||||
if (cyl < 0)
|
if (cyl < 0)
|
||||||
cyl = sensor;
|
cyl = sensor;
|
||||||
ev = loop_gas.next(*dc);
|
ev = loop_gas.next(*dc);
|
||||||
|
|
|
@ -140,7 +140,7 @@ static int divinglog_profile(void *param, int, char **data, char **)
|
||||||
state->cur_sample->pressure[0].mbar = pressure * 100;
|
state->cur_sample->pressure[0].mbar = pressure * 100;
|
||||||
state->cur_sample->rbt.seconds = rbt;
|
state->cur_sample->rbt.seconds = rbt;
|
||||||
if (oldcyl != tank && tank >= 0 && static_cast<size_t>(tank) < state->cur_dive->cylinders.size()) {
|
if (oldcyl != tank && tank >= 0 && static_cast<size_t>(tank) < state->cur_dive->cylinders.size()) {
|
||||||
struct gasmix mix = get_cylinder(state->cur_dive.get(), tank)->gasmix;
|
struct gasmix mix = state->cur_dive.get()->get_cylinder(tank)->gasmix;
|
||||||
int o2 = get_o2(mix);
|
int o2 = get_o2(mix);
|
||||||
int he = get_he(mix);
|
int he = get_he(mix);
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ int get_cylinderid_at_time(struct dive *dive, struct divecomputer *dc, duration_
|
||||||
if (event.time.seconds > time.seconds)
|
if (event.time.seconds > time.seconds)
|
||||||
break;
|
break;
|
||||||
if (event.name == "gaschange")
|
if (event.name == "gaschange")
|
||||||
cylinder_idx = get_cylinder_index(dive, event);
|
cylinder_idx = dive->get_cylinder_index(event);
|
||||||
}
|
}
|
||||||
return cylinder_idx;
|
return cylinder_idx;
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ static int tissue_at_end(struct deco_state *ds, struct dive *dive, const struct
|
||||||
: sample.setpoint;
|
: sample.setpoint;
|
||||||
|
|
||||||
duration_t t1 = sample.time;
|
duration_t t1 = sample.time;
|
||||||
struct gasmix gas = get_gasmix_at_time(*dive, *dc, t0);
|
struct gasmix gas = dive->get_gasmix_at_time(*dc, t0);
|
||||||
if (psample)
|
if (psample)
|
||||||
lastdepth = psample->depth;
|
lastdepth = psample->depth;
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ static void create_dive_from_plan(struct diveplan *diveplan, struct dive *dive,
|
||||||
if (dp->cylinderid != lastcylid) {
|
if (dp->cylinderid != lastcylid) {
|
||||||
/* need to insert a first sample for the new gas */
|
/* need to insert a first sample for the new gas */
|
||||||
add_gas_switch_event(dive, dc, lasttime + 1, dp->cylinderid);
|
add_gas_switch_event(dive, dc, lasttime + 1, dp->cylinderid);
|
||||||
cyl = get_cylinder(dive, dp->cylinderid); // FIXME: This actually may get one past the last cylinder for "surface air".
|
cyl = dive->get_cylinder(dp->cylinderid); // FIXME: This actually may get one past the last cylinder for "surface air".
|
||||||
if (!cyl) {
|
if (!cyl) {
|
||||||
report_error("Invalid cylinder in create_dive_from_plan(): %d", dp->cylinderid);
|
report_error("Invalid cylinder in create_dive_from_plan(): %d", dp->cylinderid);
|
||||||
continue;
|
continue;
|
||||||
|
@ -368,7 +368,7 @@ struct gaschanges {
|
||||||
|
|
||||||
static int setpoint_change(struct dive *dive, int cylinderid)
|
static int setpoint_change(struct dive *dive, int cylinderid)
|
||||||
{
|
{
|
||||||
cylinder_t *cylinder = get_cylinder(dive, cylinderid);
|
cylinder_t *cylinder = dive->get_cylinder(cylinderid);
|
||||||
if (cylinder->type.description.empty())
|
if (cylinder->type.description.empty())
|
||||||
return 0;
|
return 0;
|
||||||
if (starts_with(cylinder->type.description, "SP ")) {
|
if (starts_with(cylinder->type.description, "SP ")) {
|
||||||
|
@ -422,7 +422,7 @@ static std::vector<gaschanges> analyze_gaslist(struct diveplan *diveplan, struct
|
||||||
for (size_t nr = 0; nr < gaschanges.size(); nr++) {
|
for (size_t nr = 0; nr < gaschanges.size(); nr++) {
|
||||||
int idx = gaschanges[nr].gasidx;
|
int idx = gaschanges[nr].gasidx;
|
||||||
printf("gaschange nr %d: @ %5.2lfm gasidx %d (%s)\n", nr, gaschanges[nr].depth / 1000.0,
|
printf("gaschange nr %d: @ %5.2lfm gasidx %d (%s)\n", nr, gaschanges[nr].depth / 1000.0,
|
||||||
idx, gasname(&get_cylinder(&dive, idx)->gasmix));
|
idx, gasname(&dive.get_cylinder(idx)->gasmix));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return gaschanges;
|
return gaschanges;
|
||||||
|
@ -507,7 +507,7 @@ int ascent_velocity(int depth, int avg_depth, int)
|
||||||
|
|
||||||
static void track_ascent_gas(int depth, struct dive *dive, int cylinder_id, int avg_depth, int bottom_time, bool safety_stop, enum divemode_t divemode)
|
static void track_ascent_gas(int depth, struct dive *dive, int cylinder_id, int avg_depth, int bottom_time, bool safety_stop, enum divemode_t divemode)
|
||||||
{
|
{
|
||||||
cylinder_t *cylinder = get_cylinder(dive, cylinder_id);
|
cylinder_t *cylinder = dive->get_cylinder(cylinder_id);
|
||||||
while (depth > 0) {
|
while (depth > 0) {
|
||||||
int deltad = ascent_velocity(depth, avg_depth, bottom_time) * base_timestep;
|
int deltad = ascent_velocity(depth, avg_depth, bottom_time) * base_timestep;
|
||||||
if (deltad > depth)
|
if (deltad > depth)
|
||||||
|
@ -575,7 +575,7 @@ static bool enough_gas(const struct dive *dive, int current_cylinder)
|
||||||
{
|
{
|
||||||
if (current_cylinder < 0 || static_cast<size_t>(current_cylinder) >= dive->cylinders.size())
|
if (current_cylinder < 0 || static_cast<size_t>(current_cylinder) >= dive->cylinders.size())
|
||||||
return false;
|
return false;
|
||||||
const cylinder_t *cyl = get_cylinder(dive, current_cylinder);
|
const cylinder_t *cyl = dive->get_cylinder(current_cylinder);
|
||||||
|
|
||||||
if (!cyl->start.mbar)
|
if (!cyl->start.mbar)
|
||||||
return true;
|
return true;
|
||||||
|
@ -718,7 +718,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
// Find the divemode at the end of the dive
|
// Find the divemode at the end of the dive
|
||||||
divemode_loop loop(*dc);
|
divemode_loop loop(*dc);
|
||||||
divemode = loop.next(bottom_time);
|
divemode = loop.next(bottom_time);
|
||||||
gas = get_cylinder(dive, current_cylinder)->gasmix;
|
gas = dive->get_cylinder(current_cylinder)->gasmix;
|
||||||
|
|
||||||
po2 = sample.setpoint.mbar;
|
po2 = sample.setpoint.mbar;
|
||||||
depth = sample.depth.mm;
|
depth = sample.depth.mm;
|
||||||
|
@ -768,11 +768,11 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
// How long can we stay at the current depth and still directly ascent to the surface?
|
// How long can we stay at the current depth and still directly ascent to the surface?
|
||||||
do {
|
do {
|
||||||
add_segment(ds, dive->depth_to_bar(depth),
|
add_segment(ds, dive->depth_to_bar(depth),
|
||||||
get_cylinder(dive, current_cylinder)->gasmix,
|
dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
timestep, po2, divemode, prefs.bottomsac, true);
|
timestep, po2, divemode, prefs.bottomsac, true);
|
||||||
update_cylinder_pressure(dive, depth, depth, timestep, prefs.bottomsac, get_cylinder(dive, current_cylinder), false, divemode);
|
update_cylinder_pressure(dive, depth, depth, timestep, prefs.bottomsac, dive->get_cylinder(current_cylinder), false, divemode);
|
||||||
clock += timestep;
|
clock += timestep;
|
||||||
} while (trial_ascent(ds, 0, depth, 0, avg_depth, bottom_time, get_cylinder(dive, current_cylinder)->gasmix,
|
} while (trial_ascent(ds, 0, depth, 0, avg_depth, bottom_time, dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
po2, diveplan->surface_pressure / 1000.0, dive, divemode) &&
|
po2, diveplan->surface_pressure / 1000.0, dive, divemode) &&
|
||||||
enough_gas(dive, current_cylinder) && clock < 6 * 3600);
|
enough_gas(dive, current_cylinder) && clock < 6 * 3600);
|
||||||
|
|
||||||
|
@ -780,7 +780,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
// In the best of all worlds, we would roll back also the last add_segment in terms of caching deco state, but
|
// In the best of all worlds, we would roll back also the last add_segment in terms of caching deco state, but
|
||||||
// let's ignore that since for the eventual ascent in recreational mode, nobody looks at the ceiling anymore,
|
// let's ignore that since for the eventual ascent in recreational mode, nobody looks at the ceiling anymore,
|
||||||
// so we don't really have to compute the deco state.
|
// so we don't really have to compute the deco state.
|
||||||
update_cylinder_pressure(dive, depth, depth, -timestep, prefs.bottomsac, get_cylinder(dive, current_cylinder), false, divemode);
|
update_cylinder_pressure(dive, depth, depth, -timestep, prefs.bottomsac, dive->get_cylinder(current_cylinder), false, divemode);
|
||||||
clock -= timestep;
|
clock -= timestep;
|
||||||
plan_add_segment(diveplan, clock - previous_point_time, depth, current_cylinder, po2, true, divemode);
|
plan_add_segment(diveplan, clock - previous_point_time, depth, current_cylinder, po2, true, divemode);
|
||||||
previous_point_time = clock;
|
previous_point_time = clock;
|
||||||
|
@ -816,7 +816,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
|
|
||||||
if (best_first_ascend_cylinder != -1 && best_first_ascend_cylinder != current_cylinder) {
|
if (best_first_ascend_cylinder != -1 && best_first_ascend_cylinder != current_cylinder) {
|
||||||
current_cylinder = best_first_ascend_cylinder;
|
current_cylinder = best_first_ascend_cylinder;
|
||||||
gas = get_cylinder(dive, current_cylinder)->gasmix;
|
gas = dive->get_cylinder(current_cylinder)->gasmix;
|
||||||
|
|
||||||
#if DEBUG_PLAN & 16
|
#if DEBUG_PLAN & 16
|
||||||
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", best_first_ascend_cylinder,
|
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", best_first_ascend_cylinder,
|
||||||
|
@ -831,7 +831,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
po2 = 0;
|
po2 = 0;
|
||||||
int bailoutsegment = std::max(prefs.min_switch_duration, 60 * prefs.problemsolvingtime);
|
int bailoutsegment = std::max(prefs.min_switch_duration, 60 * prefs.problemsolvingtime);
|
||||||
add_segment(ds, dive->depth_to_bar(depth),
|
add_segment(ds, dive->depth_to_bar(depth),
|
||||||
get_cylinder(dive, current_cylinder)->gasmix,
|
dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
bailoutsegment, po2, divemode, prefs.bottomsac, true);
|
bailoutsegment, po2, divemode, prefs.bottomsac, true);
|
||||||
plan_add_segment(diveplan, bailoutsegment, depth, current_cylinder, po2, false, divemode);
|
plan_add_segment(diveplan, bailoutsegment, depth, current_cylinder, po2, false, divemode);
|
||||||
bottom_time += bailoutsegment;
|
bottom_time += bailoutsegment;
|
||||||
|
@ -871,7 +871,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
last_ascend_rate = ascent_velocity(depth, avg_depth, bottom_time);
|
last_ascend_rate = ascent_velocity(depth, avg_depth, bottom_time);
|
||||||
/* Always prefer the best_first_ascend_cylinder if it has the right gasmix.
|
/* Always prefer the best_first_ascend_cylinder if it has the right gasmix.
|
||||||
* Otherwise take first cylinder from list with rightgasmix */
|
* Otherwise take first cylinder from list with rightgasmix */
|
||||||
if (best_first_ascend_cylinder != -1 && same_gasmix(gas, get_cylinder(dive, best_first_ascend_cylinder)->gasmix))
|
if (best_first_ascend_cylinder != -1 && same_gasmix(gas, dive->get_cylinder(best_first_ascend_cylinder)->gasmix))
|
||||||
current_cylinder = best_first_ascend_cylinder;
|
current_cylinder = best_first_ascend_cylinder;
|
||||||
else
|
else
|
||||||
current_cylinder = get_gasidx(dive, gas);
|
current_cylinder = get_gasidx(dive, gas);
|
||||||
|
@ -896,7 +896,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
deltad = depth - stoplevels[stopidx];
|
deltad = depth - stoplevels[stopidx];
|
||||||
|
|
||||||
add_segment(ds, dive->depth_to_bar(depth),
|
add_segment(ds, dive->depth_to_bar(depth),
|
||||||
get_cylinder(dive, current_cylinder)->gasmix,
|
dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
base_timestep, po2, divemode, prefs.decosac, true);
|
base_timestep, po2, divemode, prefs.decosac, true);
|
||||||
last_segment_min_switch = false;
|
last_segment_min_switch = false;
|
||||||
clock += base_timestep;
|
clock += base_timestep;
|
||||||
|
@ -921,7 +921,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
if (current_cylinder != gaschanges[gi].gasidx) {
|
if (current_cylinder != gaschanges[gi].gasidx) {
|
||||||
if (!prefs.switch_at_req_stop ||
|
if (!prefs.switch_at_req_stop ||
|
||||||
!trial_ascent(ds, 0, depth, stoplevels[stopidx - 1], avg_depth, bottom_time,
|
!trial_ascent(ds, 0, depth, stoplevels[stopidx - 1], avg_depth, bottom_time,
|
||||||
get_cylinder(dive, current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, dive, divemode) || get_o2(get_cylinder(dive, current_cylinder)->gasmix) < 160) {
|
dive->get_cylinder(current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, dive, divemode) || get_o2(dive->get_cylinder(current_cylinder)->gasmix) < 160) {
|
||||||
if (is_final_plan)
|
if (is_final_plan)
|
||||||
plan_add_segment(diveplan, clock - previous_point_time, depth, current_cylinder, po2, false, divemode);
|
plan_add_segment(diveplan, clock - previous_point_time, depth, current_cylinder, po2, false, divemode);
|
||||||
stopping = true;
|
stopping = true;
|
||||||
|
@ -930,14 +930,14 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
if (divemode == CCR)
|
if (divemode == CCR)
|
||||||
po2 = setpoint_change(dive, current_cylinder);
|
po2 = setpoint_change(dive, current_cylinder);
|
||||||
#if DEBUG_PLAN & 16
|
#if DEBUG_PLAN & 16
|
||||||
gas = get_cylinder(dive, current_cylinder)->gasmix;
|
gas = dive->get_cylinder(current_cylinder)->gasmix;
|
||||||
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", gaschanges[gi].gasidx,
|
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", gaschanges[gi].gasidx,
|
||||||
(get_o2(&gas) + 5) / 10, (get_he(&gas) + 5) / 10, gaschanges[gi].depth / 1000.0);
|
(get_o2(&gas) + 5) / 10, (get_he(&gas) + 5) / 10, gaschanges[gi].depth / 1000.0);
|
||||||
#endif
|
#endif
|
||||||
/* Stop for the minimum duration to switch gas unless we switch to o2 */
|
/* Stop for the minimum duration to switch gas unless we switch to o2 */
|
||||||
if (!last_segment_min_switch && get_o2(get_cylinder(dive, current_cylinder)->gasmix) != 1000) {
|
if (!last_segment_min_switch && get_o2(dive->get_cylinder(current_cylinder)->gasmix) != 1000) {
|
||||||
add_segment(ds, dive->depth_to_bar(depth),
|
add_segment(ds, dive->depth_to_bar(depth),
|
||||||
get_cylinder(dive, current_cylinder)->gasmix,
|
dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
prefs.min_switch_duration, po2, divemode, prefs.decosac, true);
|
prefs.min_switch_duration, po2, divemode, prefs.decosac, true);
|
||||||
clock += prefs.min_switch_duration;
|
clock += prefs.min_switch_duration;
|
||||||
last_segment_min_switch = true;
|
last_segment_min_switch = true;
|
||||||
|
@ -957,7 +957,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
while (1) {
|
while (1) {
|
||||||
/* Check if ascending to next stop is clear, go back and wait if we hit the ceiling on the way */
|
/* Check if ascending to next stop is clear, go back and wait if we hit the ceiling on the way */
|
||||||
if (trial_ascent(ds, 0, depth, stoplevels[stopidx], avg_depth, bottom_time,
|
if (trial_ascent(ds, 0, depth, stoplevels[stopidx], avg_depth, bottom_time,
|
||||||
get_cylinder(dive, current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, dive, divemode)) {
|
dive->get_cylinder(current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, dive, divemode)) {
|
||||||
decostoptable[decostopcounter].depth = depth;
|
decostoptable[decostopcounter].depth = depth;
|
||||||
decostoptable[decostopcounter].time = 0;
|
decostoptable[decostopcounter].time = 0;
|
||||||
decostopcounter++;
|
decostopcounter++;
|
||||||
|
@ -986,14 +986,14 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
if (divemode == CCR)
|
if (divemode == CCR)
|
||||||
po2 = setpoint_change(dive, current_cylinder);
|
po2 = setpoint_change(dive, current_cylinder);
|
||||||
#if DEBUG_PLAN & 16
|
#if DEBUG_PLAN & 16
|
||||||
gas = get_cylinder(dive, current_cylinder)->gasmix;
|
gas = dive->get_cylinder(current_cylinder)->gasmix;
|
||||||
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", gaschanges[gi + 1].gasidx,
|
printf("switch to gas %d (%d/%d) @ %5.2lfm\n", gaschanges[gi + 1].gasidx,
|
||||||
(get_o2(&gas) + 5) / 10, (get_he(&gas) + 5) / 10, gaschanges[gi + 1].depth / 1000.0);
|
(get_o2(&gas) + 5) / 10, (get_he(&gas) + 5) / 10, gaschanges[gi + 1].depth / 1000.0);
|
||||||
#endif
|
#endif
|
||||||
/* Stop for the minimum duration to switch gas unless we switch to o2 */
|
/* Stop for the minimum duration to switch gas unless we switch to o2 */
|
||||||
if (!last_segment_min_switch && get_o2(get_cylinder(dive, current_cylinder)->gasmix) != 1000) {
|
if (!last_segment_min_switch && get_o2(dive->get_cylinder(current_cylinder)->gasmix) != 1000) {
|
||||||
add_segment(ds, dive->depth_to_bar(depth),
|
add_segment(ds, dive->depth_to_bar(depth),
|
||||||
get_cylinder(dive, current_cylinder)->gasmix,
|
dive->get_cylinder(current_cylinder)->gasmix,
|
||||||
prefs.min_switch_duration, po2, divemode, prefs.decosac, true);
|
prefs.min_switch_duration, po2, divemode, prefs.decosac, true);
|
||||||
clock += prefs.min_switch_duration;
|
clock += prefs.min_switch_duration;
|
||||||
}
|
}
|
||||||
|
@ -1001,7 +1001,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
}
|
}
|
||||||
|
|
||||||
int new_clock = wait_until(ds, dive, clock, clock, laststoptime * 2 + 1, timestep, depth, stoplevels[stopidx], avg_depth,
|
int new_clock = wait_until(ds, dive, clock, clock, laststoptime * 2 + 1, timestep, depth, stoplevels[stopidx], avg_depth,
|
||||||
bottom_time, get_cylinder(dive, current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, divemode);
|
bottom_time, dive->get_cylinder(current_cylinder)->gasmix, po2, diveplan->surface_pressure / 1000.0, divemode);
|
||||||
laststoptime = new_clock - clock;
|
laststoptime = new_clock - clock;
|
||||||
/* Finish infinite deco */
|
/* Finish infinite deco */
|
||||||
if (laststoptime >= 48 * 3600 && depth >= 6000) {
|
if (laststoptime >= 48 * 3600 && depth >= 6000) {
|
||||||
|
@ -1016,12 +1016,12 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
* backgas. This could be customized if there were demand.
|
* backgas. This could be customized if there were demand.
|
||||||
*/
|
*/
|
||||||
if (break_cylinder == -1) {
|
if (break_cylinder == -1) {
|
||||||
if (best_first_ascend_cylinder != -1 && get_o2(get_cylinder(dive, best_first_ascend_cylinder)->gasmix) <= 320)
|
if (best_first_ascend_cylinder != -1 && get_o2(dive->get_cylinder(best_first_ascend_cylinder)->gasmix) <= 320)
|
||||||
break_cylinder = best_first_ascend_cylinder;
|
break_cylinder = best_first_ascend_cylinder;
|
||||||
else
|
else
|
||||||
break_cylinder = 0;
|
break_cylinder = 0;
|
||||||
}
|
}
|
||||||
if (get_o2(get_cylinder(dive, current_cylinder)->gasmix) == 1000) {
|
if (get_o2(dive->get_cylinder(current_cylinder)->gasmix) == 1000) {
|
||||||
if (laststoptime >= 12 * 60) {
|
if (laststoptime >= 12 * 60) {
|
||||||
laststoptime = 12 * 60;
|
laststoptime = 12 * 60;
|
||||||
new_clock = clock + laststoptime;
|
new_clock = clock + laststoptime;
|
||||||
|
@ -1046,7 +1046,7 @@ bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add_segment(ds, dive->depth_to_bar(depth), get_cylinder(dive, stop_cylinder)->gasmix,
|
add_segment(ds, dive->depth_to_bar(depth), dive->get_cylinder(stop_cylinder)->gasmix,
|
||||||
laststoptime, po2, divemode, prefs.decosac, true);
|
laststoptime, po2, divemode, prefs.decosac, true);
|
||||||
last_segment_min_switch = false;
|
last_segment_min_switch = false;
|
||||||
decostoptable[decostopcounter].depth = depth;
|
decostoptable[decostopcounter].depth = depth;
|
||||||
|
|
|
@ -191,13 +191,13 @@ void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_d
|
||||||
nextdp = dp->next;
|
nextdp = dp->next;
|
||||||
if (dp->time == 0)
|
if (dp->time == 0)
|
||||||
continue;
|
continue;
|
||||||
gasmix = get_cylinder(dive, dp->cylinderid)->gasmix;
|
gasmix = dive->get_cylinder(dp->cylinderid)->gasmix;
|
||||||
depthvalue = get_depth_units(dp->depth.mm, &decimals, &depth_unit);
|
depthvalue = get_depth_units(dp->depth.mm, &decimals, &depth_unit);
|
||||||
/* analyze the dive points ahead */
|
/* analyze the dive points ahead */
|
||||||
while (nextdp && nextdp->time == 0)
|
while (nextdp && nextdp->time == 0)
|
||||||
nextdp = nextdp->next;
|
nextdp = nextdp->next;
|
||||||
if (nextdp)
|
if (nextdp)
|
||||||
newgasmix = get_cylinder(dive, nextdp->cylinderid)->gasmix;
|
newgasmix = dive->get_cylinder(nextdp->cylinderid)->gasmix;
|
||||||
gaschange_after = (nextdp && (gasmix_distance(gasmix, newgasmix)));
|
gaschange_after = (nextdp && (gasmix_distance(gasmix, newgasmix)));
|
||||||
gaschange_before = (gasmix_distance(lastprintgasmix, gasmix));
|
gaschange_before = (gasmix_distance(lastprintgasmix, gasmix));
|
||||||
rebreatherchange_after = (nextdp && (dp->setpoint != nextdp->setpoint || dp->divemode != nextdp->divemode));
|
rebreatherchange_after = (nextdp && (dp->setpoint != nextdp->setpoint || dp->divemode != nextdp->divemode));
|
||||||
|
@ -577,7 +577,7 @@ void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool show_d
|
||||||
while (dp) {
|
while (dp) {
|
||||||
if (dp->time != 0) {
|
if (dp->time != 0) {
|
||||||
std::string temp;
|
std::string temp;
|
||||||
struct gasmix gasmix = get_cylinder(dive, dp->cylinderid)->gasmix;
|
struct gasmix gasmix = dive->get_cylinder(dp->cylinderid)->gasmix;
|
||||||
|
|
||||||
divemode_t current_divemode = loop.next(dp->time);
|
divemode_t current_divemode = loop.next(dp->time);
|
||||||
amb = dive->depth_to_atm(dp->depth.mm);
|
amb = dive->depth_to_atm(dp->depth.mm);
|
||||||
|
|
|
@ -126,7 +126,7 @@ static int get_local_sac(struct plot_info &pi, int idx1, int idx2, struct dive *
|
||||||
depth = (entry1.depth + entry2.depth) / 2;
|
depth = (entry1.depth + entry2.depth) / 2;
|
||||||
atm = dive->depth_to_atm(depth);
|
atm = dive->depth_to_atm(depth);
|
||||||
|
|
||||||
cyl = get_cylinder(dive, index);
|
cyl = dive->get_cylinder(index);
|
||||||
|
|
||||||
airuse = gas_volume(cyl, a) - gas_volume(cyl, b);
|
airuse = gas_volume(cyl, a) - gas_volume(cyl, b);
|
||||||
|
|
||||||
|
@ -193,35 +193,6 @@ static void analyze_plot_info(struct plot_info &pi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If the event has an explicit cylinder index,
|
|
||||||
* we return that. If it doesn't, we return the best
|
|
||||||
* match based on the gasmix.
|
|
||||||
*
|
|
||||||
* Some dive computers give cylinder indices, some
|
|
||||||
* give just the gas mix.
|
|
||||||
*/
|
|
||||||
int get_cylinder_index(const struct dive *dive, const struct event &ev)
|
|
||||||
{
|
|
||||||
int best;
|
|
||||||
struct gasmix mix;
|
|
||||||
|
|
||||||
if (ev.gas.index >= 0)
|
|
||||||
return ev.gas.index;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This should no longer happen!
|
|
||||||
*
|
|
||||||
* We now match up gas change events with their cylinders at dive
|
|
||||||
* event fixup time.
|
|
||||||
*/
|
|
||||||
report_info("Still looking up cylinder based on gas mix in get_cylinder_index()!");
|
|
||||||
|
|
||||||
mix = get_gasmix_from_event(dive, ev);
|
|
||||||
best = find_best_gasmix_match(mix, dive->cylinders);
|
|
||||||
return best < 0 ? 0 : best;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t set_setpoint(struct plot_info &pi, size_t i, int setpoint, int end)
|
static size_t set_setpoint(struct plot_info &pi, size_t i, int setpoint, int end)
|
||||||
{
|
{
|
||||||
while (i < pi.entry.size()) {
|
while (i < pi.entry.size()) {
|
||||||
|
@ -508,7 +479,7 @@ static int sac_between(const struct dive *dive, const struct plot_info &pi, int
|
||||||
|
|
||||||
a.mbar = get_plot_pressure(pi, first, i);
|
a.mbar = get_plot_pressure(pi, first, i);
|
||||||
b.mbar = get_plot_pressure(pi, last, i);
|
b.mbar = get_plot_pressure(pi, last, i);
|
||||||
const cylinder_t *cyl = get_cylinder(dive, i);
|
const cylinder_t *cyl = dive->get_cylinder(i);
|
||||||
int cyluse = gas_volume(cyl, a) - gas_volume(cyl, b);
|
int cyluse = gas_volume(cyl, a) - gas_volume(cyl, b);
|
||||||
if (cyluse > 0)
|
if (cyluse > 0)
|
||||||
airuse += cyluse;
|
airuse += cyluse;
|
||||||
|
@ -704,7 +675,7 @@ static void setup_gas_sensor_pressure(const struct dive *dive, const struct dive
|
||||||
std::vector<int> first(num_cyl, 0);
|
std::vector<int> first(num_cyl, 0);
|
||||||
std::vector<int> last(num_cyl, INT_MAX);
|
std::vector<int> last(num_cyl, INT_MAX);
|
||||||
|
|
||||||
int prev = explicit_first_cylinder(dive, dc);
|
int prev = dive->explicit_first_cylinder(dc);
|
||||||
prev = prev >= 0 ? prev : 0;
|
prev = prev >= 0 ? prev : 0;
|
||||||
seen[prev] = 1;
|
seen[prev] = 1;
|
||||||
|
|
||||||
|
@ -735,7 +706,7 @@ static void setup_gas_sensor_pressure(const struct dive *dive, const struct dive
|
||||||
// Fill in "seen[]" array - mark cylinders we're not interested
|
// Fill in "seen[]" array - mark cylinders we're not interested
|
||||||
// in as negative.
|
// in as negative.
|
||||||
for (int i = 0; i < pi.nr_cylinders; i++) {
|
for (int i = 0; i < pi.nr_cylinders; i++) {
|
||||||
const cylinder_t *cyl = get_cylinder(dive, i);
|
const cylinder_t *cyl = dive->get_cylinder(i);
|
||||||
int start = cyl->start.mbar;
|
int start = cyl->start.mbar;
|
||||||
int end = cyl->end.mbar;
|
int end = cyl->end.mbar;
|
||||||
|
|
||||||
|
@ -756,7 +727,7 @@ static void setup_gas_sensor_pressure(const struct dive *dive, const struct dive
|
||||||
|
|
||||||
/* If it's only mentioned by other dc's, ignore it */
|
/* If it's only mentioned by other dc's, ignore it */
|
||||||
for (auto &secondary: dive->dcs) {
|
for (auto &secondary: dive->dcs) {
|
||||||
if (has_gaschange_event(dive, &secondary, i)) {
|
if (dive->has_gaschange_event(&secondary, i)) {
|
||||||
seen[i] = -1;
|
seen[i] = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -765,7 +736,7 @@ static void setup_gas_sensor_pressure(const struct dive *dive, const struct dive
|
||||||
|
|
||||||
for (int i = 0; i < pi.nr_cylinders; i++) {
|
for (int i = 0; i < pi.nr_cylinders; i++) {
|
||||||
if (seen[i] >= 0) {
|
if (seen[i] >= 0) {
|
||||||
const cylinder_t *cyl = get_cylinder(dive, i);
|
const cylinder_t *cyl = dive->get_cylinder(i);
|
||||||
|
|
||||||
add_plot_pressure(pi, first[i], i, cyl->start);
|
add_plot_pressure(pi, first[i], i, cyl->start);
|
||||||
add_plot_pressure(pi, last[i], i, cyl->end);
|
add_plot_pressure(pi, last[i], i, cyl->end);
|
||||||
|
@ -1306,7 +1277,7 @@ static std::vector<std::string> plot_string(const struct dive *d, const struct p
|
||||||
int mbar = get_plot_pressure(pi, idx, cyl);
|
int mbar = get_plot_pressure(pi, idx, cyl);
|
||||||
if (!mbar)
|
if (!mbar)
|
||||||
continue;
|
continue;
|
||||||
struct gasmix mix = get_cylinder(d, cyl)->gasmix;
|
struct gasmix mix = d->get_cylinder(cyl)->gasmix;
|
||||||
pressurevalue = get_pressure_units(mbar, &pressure_unit);
|
pressurevalue = get_pressure_units(mbar, &pressure_unit);
|
||||||
res.push_back(casprintf_loc(translate("gettextFromC", "P: %d%s (%s)"), pressurevalue, pressure_unit, gasname(mix)));
|
res.push_back(casprintf_loc(translate("gettextFromC", "P: %d%s (%s)"), pressurevalue, pressure_unit, gasname(mix)));
|
||||||
}
|
}
|
||||||
|
@ -1531,7 +1502,7 @@ std::vector<std::string> compare_samples(const struct dive *d, const struct plot
|
||||||
if (last_pressures[cylinder_index]) {
|
if (last_pressures[cylinder_index]) {
|
||||||
bar_used[cylinder_index] += last_pressures[cylinder_index] - next_pressure;
|
bar_used[cylinder_index] += last_pressures[cylinder_index] - next_pressure;
|
||||||
|
|
||||||
const cylinder_t *cyl = get_cylinder(d, cylinder_index);
|
const cylinder_t *cyl = d->get_cylinder(cylinder_index);
|
||||||
|
|
||||||
volumes_used[cylinder_index] += gas_volume(cyl, (pressure_t){ last_pressures[cylinder_index] }) - gas_volume(cyl, (pressure_t){ next_pressure });
|
volumes_used[cylinder_index] += gas_volume(cyl, (pressure_t){ last_pressures[cylinder_index] }) - gas_volume(cyl, (pressure_t){ next_pressure });
|
||||||
}
|
}
|
||||||
|
@ -1584,7 +1555,7 @@ std::vector<std::string> compare_samples(const struct dive *d, const struct plot
|
||||||
total_bar_used += bar_used[cylinder_index];
|
total_bar_used += bar_used[cylinder_index];
|
||||||
total_volume_used += volumes_used[cylinder_index];
|
total_volume_used += volumes_used[cylinder_index];
|
||||||
|
|
||||||
const cylinder_t *cyl = get_cylinder(d, cylinder_index);
|
const cylinder_t *cyl = d->get_cylinder(cylinder_index);
|
||||||
if (cyl->type.size.mliter) {
|
if (cyl->type.size.mliter) {
|
||||||
if (cylinder_volume.mliter && cylinder_volume.mliter != cyl->type.size.mliter) {
|
if (cylinder_volume.mliter && cylinder_volume.mliter != cyl->type.size.mliter) {
|
||||||
cylindersizes_are_identical = false;
|
cylindersizes_are_identical = false;
|
||||||
|
|
|
@ -351,7 +351,7 @@ QVector<QPair<QString, int>> selectedDivesGasUsed()
|
||||||
std::vector<volume_t> diveGases = get_gas_used(d);
|
std::vector<volume_t> diveGases = get_gas_used(d);
|
||||||
for (size_t j = 0; j < d->cylinders.size(); j++) {
|
for (size_t j = 0; j < d->cylinders.size(); j++) {
|
||||||
if (diveGases[j].mliter) {
|
if (diveGases[j].mliter) {
|
||||||
QString gasName = gasname(get_cylinder(d, j)->gasmix);
|
QString gasName = gasname(d->get_cylinder(j)->gasmix);
|
||||||
gasUsed[gasName] += diveGases[j].mliter;
|
gasUsed[gasName] += diveGases[j].mliter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,7 +385,7 @@ static void save_one_event(struct membuffer *b, const struct dive &dive, const s
|
||||||
show_index(b, ev.value, "value=", "");
|
show_index(b, ev.value, "value=", "");
|
||||||
show_utf8(b, " name=", ev.name.c_str(), "");
|
show_utf8(b, " name=", ev.name.c_str(), "");
|
||||||
if (ev.is_gaschange()) {
|
if (ev.is_gaschange()) {
|
||||||
struct gasmix mix = get_gasmix_from_event(&dive, ev);
|
struct gasmix mix = dive.get_gasmix_from_event(ev);
|
||||||
if (ev.gas.index >= 0)
|
if (ev.gas.index >= 0)
|
||||||
show_integer(b, ev.gas.index, "cylinder=", "");
|
show_integer(b, ev.gas.index, "cylinder=", "");
|
||||||
put_gasmix(b, mix);
|
put_gasmix(b, mix);
|
||||||
|
|
|
@ -352,7 +352,7 @@ static void save_one_event(struct membuffer *b, const struct dive &dive, const s
|
||||||
show_index(b, ev.value, "value='", "'");
|
show_index(b, ev.value, "value='", "'");
|
||||||
show_utf8(b, ev.name.c_str(), " name='", "'", 1);
|
show_utf8(b, ev.name.c_str(), " name='", "'", 1);
|
||||||
if (ev.is_gaschange()) {
|
if (ev.is_gaschange()) {
|
||||||
struct gasmix mix = get_gasmix_from_event(&dive, ev);
|
struct gasmix mix = dive.get_gasmix_from_event(ev);
|
||||||
if (ev.gas.index >= 0)
|
if (ev.gas.index >= 0)
|
||||||
show_integer(b, ev.gas.index, "cylinder='", "'");
|
show_integer(b, ev.gas.index, "cylinder='", "'");
|
||||||
put_gasmix(b, mix);
|
put_gasmix(b, mix);
|
||||||
|
|
|
@ -249,51 +249,6 @@ stats_t calculate_stats_selected()
|
||||||
|
|
||||||
#define SOME_GAS 5000 // 5bar drop in cylinder pressure makes cylinder used
|
#define SOME_GAS 5000 // 5bar drop in cylinder pressure makes cylinder used
|
||||||
|
|
||||||
bool has_gaschange_event(const struct dive *dive, const struct divecomputer *dc, int idx)
|
|
||||||
{
|
|
||||||
bool first_gas_explicit = false;
|
|
||||||
event_loop loop("gaschange");
|
|
||||||
while (auto event = loop.next(*dc)) {
|
|
||||||
if (!dc->samples.empty() && (event->time.seconds == 0 ||
|
|
||||||
(dc->samples[0].time.seconds == event->time.seconds)))
|
|
||||||
first_gas_explicit = true;
|
|
||||||
if (get_cylinder_index(dive, *event) == idx)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return !first_gas_explicit && idx == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_cylinder_used(const struct dive *dive, int idx)
|
|
||||||
{
|
|
||||||
if (idx < 0 || static_cast<size_t>(idx) >= dive->cylinders.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const cylinder_t &cyl = dive->cylinders[idx];
|
|
||||||
if ((cyl.start.mbar - cyl.end.mbar) > SOME_GAS)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if ((cyl.sample_start.mbar - cyl.sample_end.mbar) > SOME_GAS)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
for (auto &dc: dive->dcs) {
|
|
||||||
if (has_gaschange_event(dive, &dc, idx))
|
|
||||||
return true;
|
|
||||||
else if (dc.divemode == CCR && idx == get_cylinder_idx_by_use(dive, OXYGEN))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_cylinder_prot(const struct dive *dive, int idx)
|
|
||||||
{
|
|
||||||
if (idx < 0 || static_cast<size_t>(idx) >= dive->cylinders.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return std::any_of(dive->dcs.begin(), dive->dcs.end(),
|
|
||||||
[dive, idx](auto &dc)
|
|
||||||
{ return has_gaschange_event(dive, &dc, idx); });
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns a vector with dive->cylinders.size() entries */
|
/* Returns a vector with dive->cylinders.size() entries */
|
||||||
std::vector<volume_t> get_gas_used(struct dive *dive)
|
std::vector<volume_t> get_gas_used(struct dive *dive)
|
||||||
{
|
{
|
||||||
|
@ -334,7 +289,7 @@ std::pair<volume_t, volume_t> selected_dives_gas_parts()
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (auto &gas: get_gas_used(d.get())) {
|
for (auto &gas: get_gas_used(d.get())) {
|
||||||
if (gas.mliter) {
|
if (gas.mliter) {
|
||||||
auto [o2, he] = get_gas_parts(get_cylinder(d.get(), j)->gasmix, gas, O2_IN_AIR);
|
auto [o2, he] = get_gas_parts(d->get_cylinder(j)->gasmix, gas, O2_IN_AIR);
|
||||||
o2_tot.mliter += o2.mliter;
|
o2_tot.mliter += o2.mliter;
|
||||||
he_tot.mliter += he.mliter;
|
he_tot.mliter += he.mliter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ QStringList formatGetCylinder(const dive *d)
|
||||||
{
|
{
|
||||||
QStringList getCylinder;
|
QStringList getCylinder;
|
||||||
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
||||||
if (is_cylinder_used(d, i))
|
if (d->is_cylinder_used(i))
|
||||||
getCylinder << QString::fromStdString(cyl.type.description);
|
getCylinder << QString::fromStdString(cyl.type.description);
|
||||||
}
|
}
|
||||||
return getCylinder;
|
return getCylinder;
|
||||||
|
@ -89,7 +89,7 @@ QStringList formatStartPressure(const dive *d)
|
||||||
{
|
{
|
||||||
QStringList startPressure;
|
QStringList startPressure;
|
||||||
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
||||||
if (is_cylinder_used(d, i))
|
if (d->is_cylinder_used(i))
|
||||||
startPressure << getPressures(cyl, START_PRESSURE);
|
startPressure << getPressures(cyl, START_PRESSURE);
|
||||||
}
|
}
|
||||||
return startPressure;
|
return startPressure;
|
||||||
|
@ -99,7 +99,7 @@ QStringList formatEndPressure(const dive *d)
|
||||||
{
|
{
|
||||||
QStringList endPressure;
|
QStringList endPressure;
|
||||||
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
||||||
if (is_cylinder_used(d, i))
|
if (d->is_cylinder_used(i))
|
||||||
endPressure << getPressures(cyl, END_PRESSURE);
|
endPressure << getPressures(cyl, END_PRESSURE);
|
||||||
}
|
}
|
||||||
return endPressure;
|
return endPressure;
|
||||||
|
@ -109,7 +109,7 @@ QStringList formatFirstGas(const dive *d)
|
||||||
{
|
{
|
||||||
QStringList gas;
|
QStringList gas;
|
||||||
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
||||||
if (is_cylinder_used(d, i))
|
if (d->is_cylinder_used(i))
|
||||||
gas << get_gas_string(cyl.gasmix);
|
gas << get_gas_string(cyl.gasmix);
|
||||||
}
|
}
|
||||||
return gas;
|
return gas;
|
||||||
|
@ -174,7 +174,7 @@ QString formatGas(const dive *d)
|
||||||
*/
|
*/
|
||||||
QString gases;
|
QString gases;
|
||||||
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
for (auto [i, cyl]: enumerated_range(d->cylinders)) {
|
||||||
if (!is_cylinder_used(d, i))
|
if (!d->is_cylinder_used(i))
|
||||||
continue;
|
continue;
|
||||||
QString gas = QString::fromStdString(cyl.type.description);
|
QString gas = QString::fromStdString(cyl.type.description);
|
||||||
if (!gas.isEmpty())
|
if (!gas.isEmpty())
|
||||||
|
|
|
@ -346,7 +346,7 @@ void DiveComponentSelection::buttonClicked(QAbstractButton *button)
|
||||||
if (what->cylinders) {
|
if (what->cylinders) {
|
||||||
text << tr("Cylinders:\n");
|
text << tr("Cylinders:\n");
|
||||||
for (auto [idx, cyl]: enumerated_range(current_dive->cylinders)) {
|
for (auto [idx, cyl]: enumerated_range(current_dive->cylinders)) {
|
||||||
if (is_cylinder_used(current_dive, idx))
|
if (current_dive->is_cylinder_used(idx))
|
||||||
text << QString::fromStdString(cyl.type.description) << " " << gasname(cyl.gasmix) << "\n";
|
text << QString::fromStdString(cyl.type.description) << " " << gasname(cyl.gasmix) << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,12 +134,12 @@ void TabDiveInformation::updateProfile()
|
||||||
QString gaslist, SACs, separator;
|
QString gaslist, SACs, separator;
|
||||||
|
|
||||||
for (size_t i = 0; i < currentDive->cylinders.size(); i++) {
|
for (size_t i = 0; i < currentDive->cylinders.size(); i++) {
|
||||||
if (!is_cylinder_used(currentDive, i))
|
if (!currentDive->is_cylinder_used(i))
|
||||||
continue;
|
continue;
|
||||||
gaslist.append(separator); volumes.append(separator); SACs.append(separator);
|
gaslist.append(separator); volumes.append(separator); SACs.append(separator);
|
||||||
separator = "\n";
|
separator = "\n";
|
||||||
|
|
||||||
gaslist.append(gasname(get_cylinder(currentDive, i)->gasmix));
|
gaslist.append(gasname(currentDive->get_cylinder(i)->gasmix));
|
||||||
if (!gases[i].mliter)
|
if (!gases[i].mliter)
|
||||||
continue;
|
continue;
|
||||||
volumes.append(get_volume_string(gases[i], true));
|
volumes.append(get_volume_string(gases[i], true));
|
||||||
|
|
|
@ -1242,7 +1242,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
if (formatStartPressure(d) != startpressure || formatEndPressure(d) != endpressure) {
|
if (formatStartPressure(d) != startpressure || formatEndPressure(d) != endpressure) {
|
||||||
diveChanged = true;
|
diveChanged = true;
|
||||||
for ( int i = 0, j = 0 ; j < startpressure.length() && j < endpressure.length() ; i++ ) {
|
for ( int i = 0, j = 0 ; j < startpressure.length() && j < endpressure.length() ; i++ ) {
|
||||||
if (state != "add" && !is_cylinder_used(d, i))
|
if (state != "add" && !d->is_cylinder_used(i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cylinder_t *cyl = get_or_create_cylinder(d, i);
|
cylinder_t *cyl = get_or_create_cylinder(d, i);
|
||||||
|
@ -1257,7 +1257,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
// gasmix for first cylinder
|
// gasmix for first cylinder
|
||||||
if (formatFirstGas(d) != gasmix) {
|
if (formatFirstGas(d) != gasmix) {
|
||||||
for ( int i = 0, j = 0 ; j < gasmix.length() ; i++ ) {
|
for ( int i = 0, j = 0 ; j < gasmix.length() ; i++ ) {
|
||||||
if (state != "add" && !is_cylinder_used(d, i))
|
if (state != "add" && !d->is_cylinder_used(i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int o2 = parseGasMixO2(gasmix[j]);
|
int o2 = parseGasMixO2(gasmix[j]);
|
||||||
|
@ -1268,7 +1268,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
o2 + he <= 1000) {
|
o2 + he <= 1000) {
|
||||||
diveChanged = true;
|
diveChanged = true;
|
||||||
get_or_create_cylinder(d, i)->gasmix.o2.permille = o2;
|
get_or_create_cylinder(d, i)->gasmix.o2.permille = o2;
|
||||||
get_cylinder(d, i)->gasmix.he.permille = he;
|
d->get_cylinder(i)->gasmix.he.permille = he;
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
@ -1278,7 +1278,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
diveChanged = true;
|
diveChanged = true;
|
||||||
int size = 0, wp = 0, j = 0, k = 0;
|
int size = 0, wp = 0, j = 0, k = 0;
|
||||||
for (j = 0; k < usedCylinder.length(); j++) {
|
for (j = 0; k < usedCylinder.length(); j++) {
|
||||||
if (state != "add" && !is_cylinder_used(d, j))
|
if (state != "add" && !d->is_cylinder_used(j))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (const tank_info &ti: tank_info_table) {
|
for (const tank_info &ti: tank_info_table) {
|
||||||
|
@ -1294,8 +1294,8 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
get_or_create_cylinder(d, j)->type.description = usedCylinder[k].toStdString();
|
get_or_create_cylinder(d, j)->type.description = usedCylinder[k].toStdString();
|
||||||
get_cylinder(d, j)->type.size.mliter = size;
|
d->get_cylinder(j)->type.size.mliter = size;
|
||||||
get_cylinder(d, j)->type.workingpressure.mbar = wp;
|
d->get_cylinder(j)->type.workingpressure.mbar = wp;
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ void DiveEventItem::setupPixmap(struct gasmix lastgasmix, const DivePixmaps &pix
|
||||||
setPixmap(pixmaps.bookmark);
|
setPixmap(pixmaps.bookmark);
|
||||||
setOffset(QPointF(0.0, -pixmap().height()));
|
setOffset(QPointF(0.0, -pixmap().height()));
|
||||||
} else if (ev.is_gaschange()) {
|
} else if (ev.is_gaschange()) {
|
||||||
struct gasmix mix = get_gasmix_from_event(dive, ev);
|
struct gasmix mix = dive->get_gasmix_from_event(ev);
|
||||||
struct icd_data icd_data;
|
struct icd_data icd_data;
|
||||||
bool icd = isobaric_counterdiffusion(lastgasmix, mix, &icd_data);
|
bool icd = isobaric_counterdiffusion(lastgasmix, mix, &icd_data);
|
||||||
if (mix.he.permille) {
|
if (mix.he.permille) {
|
||||||
|
@ -123,7 +123,7 @@ void DiveEventItem::setupToolTipString(struct gasmix lastgasmix)
|
||||||
|
|
||||||
if (ev.is_gaschange()) {
|
if (ev.is_gaschange()) {
|
||||||
struct icd_data icd_data;
|
struct icd_data icd_data;
|
||||||
struct gasmix mix = get_gasmix_from_event(dive, ev);
|
struct gasmix mix = dive->get_gasmix_from_event(ev);
|
||||||
name += ": ";
|
name += ": ";
|
||||||
name += gasname(mix);
|
name += gasname(mix);
|
||||||
|
|
||||||
|
|
|
@ -602,9 +602,7 @@ void DiveGasPressureItem::replot(const dive *d, int fromIn, int toIn, bool in_pl
|
||||||
|
|
||||||
bool showDescriptions = false;
|
bool showDescriptions = false;
|
||||||
for (int cyl = 0; cyl < pInfo.nr_cylinders; cyl++) {
|
for (int cyl = 0; cyl < pInfo.nr_cylinders; cyl++) {
|
||||||
const cylinder_t *c = get_cylinder(d, cyl);
|
const cylinder_t *c = d->get_cylinder(cyl);
|
||||||
if (!c)
|
|
||||||
continue;
|
|
||||||
showDescriptions = showDescriptions || (c && same_gasmix_cylinder(*c, cyl, d, true) != -1);
|
showDescriptions = showDescriptions || (c && same_gasmix_cylinder(*c, cyl, d, true) != -1);
|
||||||
if (act_segments[cyl].polygon.empty())
|
if (act_segments[cyl].polygon.empty())
|
||||||
continue;
|
continue;
|
||||||
|
@ -634,7 +632,7 @@ void DiveGasPressureItem::replot(const dive *d, int fromIn, int toIn, bool in_pl
|
||||||
|
|
||||||
// For each cylinder, on right hand side of the curve, write cylinder pressure
|
// For each cylinder, on right hand side of the curve, write cylinder pressure
|
||||||
double x_offset = plotPressureValue(segment.last.pressure, segment.last.time, Qt::AlignTop | Qt::AlignLeft, y_offset) + 2;
|
double x_offset = plotPressureValue(segment.last.pressure, segment.last.time, Qt::AlignTop | Qt::AlignLeft, y_offset) + 2;
|
||||||
plotGasValue(segment.last.pressure, segment.last.time, get_cylinder(d, segment.cyl), Qt::AlignTop | Qt::AlignLeft, x_offset, y_offset, showDescriptions);
|
plotGasValue(segment.last.pressure, segment.last.time, d->get_cylinder(segment.cyl), Qt::AlignTop | Qt::AlignLeft, x_offset, y_offset, showDescriptions);
|
||||||
|
|
||||||
/* Alternate alignment as we see cylinder use.. */
|
/* Alternate alignment as we see cylinder use.. */
|
||||||
startAlignVar ^= Qt::AlignTop | Qt::AlignBottom;
|
startAlignVar ^= Qt::AlignTop | Qt::AlignBottom;
|
||||||
|
|
|
@ -551,7 +551,7 @@ void ProfileScene::plotDive(const struct dive *dIn, int dcIn, DivePlannerPointsM
|
||||||
// while all other items are up there on the constructor.
|
// while all other items are up there on the constructor.
|
||||||
qDeleteAll(eventItems);
|
qDeleteAll(eventItems);
|
||||||
eventItems.clear();
|
eventItems.clear();
|
||||||
struct gasmix lastgasmix = get_gasmix_at_time(*d, *currentdc, duration_t{1});
|
struct gasmix lastgasmix = d->get_gasmix_at_time(*currentdc, duration_t{1});
|
||||||
|
|
||||||
for (auto [idx, event]: enumerated_range(currentdc->events)) {
|
for (auto [idx, event]: enumerated_range(currentdc->events)) {
|
||||||
// if print mode is selected only draw headings, SP change, gas events or bookmark event
|
// if print mode is selected only draw headings, SP change, gas events or bookmark event
|
||||||
|
@ -571,7 +571,7 @@ void ProfileScene::plotDive(const struct dive *dIn, int dcIn, DivePlannerPointsM
|
||||||
eventItems.push_back(item);
|
eventItems.push_back(item);
|
||||||
}
|
}
|
||||||
if (event.is_gaschange())
|
if (event.is_gaschange())
|
||||||
lastgasmix = get_gasmix_from_event(d, event);
|
lastgasmix = d->get_gasmix_from_event(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString dcText = QString::fromStdString(get_dc_nickname(currentdc));
|
QString dcText = QString::fromStdString(get_dc_nickname(currentdc));
|
||||||
|
|
|
@ -614,7 +614,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
|
||||||
if (gasChangeIdx < plotInfo.nr - 1) {
|
if (gasChangeIdx < plotInfo.nr - 1) {
|
||||||
int newGasIdx = gasChangeIdx + 1;
|
int newGasIdx = gasChangeIdx + 1;
|
||||||
const struct plot_data &newGasEntry = plotInfo.entry[newGasIdx];
|
const struct plot_data &newGasEntry = plotInfo.entry[newGasIdx];
|
||||||
if (get_plot_sensor_pressure(&plotInfo, gasChangeIdx) == 0 || get_cylinder(d, gasChangeEntry->sensor[0])->sample_start.mbar == 0) {
|
if (get_plot_sensor_pressure(&plotInfo, gasChangeIdx) == 0 || d->get_cylinder(gasChangeEntry->sensor[0])->sample_start.mbar == 0) {
|
||||||
// if we have no sensorpressure or if we have no pressure from samples we can assume that
|
// if we have no sensorpressure or if we have no pressure from samples we can assume that
|
||||||
// we only have interpolated pressure (the pressure in the entry may be stored in the sensor
|
// we only have interpolated pressure (the pressure in the entry may be stored in the sensor
|
||||||
// pressure field if this is the first or last entry for this tank... see details in gaspressures.c
|
// pressure field if this is the first or last entry for this tank... see details in gaspressures.c
|
||||||
|
@ -623,7 +623,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
|
||||||
QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)")
|
QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)")
|
||||||
.arg(gasChangeEntry->sensor[0] + 1).arg(get_pressure_string(pressure)));
|
.arg(gasChangeEntry->sensor[0] + 1).arg(get_pressure_string(pressure)));
|
||||||
}
|
}
|
||||||
if (get_plot_sensor_pressure(&plotInfo, newGasIdx) == 0 || get_cylinder(d, newGasEntry->sensor[0])->sample_start.mbar == 0) {
|
if (get_plot_sensor_pressure(&plotInfo, newGasIdx) == 0 || d->get_cylinder(newGasEntry->sensor[0])->sample_start.mbar == 0) {
|
||||||
// we only have interpolated press -- see commend above
|
// we only have interpolated press -- see commend above
|
||||||
pressure_t pressure;
|
pressure_t pressure;
|
||||||
pressure.mbar = get_plot_interpolated_pressure(&plotInfo, newGasIdx) ? : get_plot_sensor_pressure(&plotInfo, newGasIdx);
|
pressure.mbar = get_plot_interpolated_pressure(&plotInfo, newGasIdx) ? : get_plot_sensor_pressure(&plotInfo, newGasIdx);
|
||||||
|
@ -920,7 +920,7 @@ void ProfileWidget2::repositionDiveHandlers()
|
||||||
QPointF pos = line.pointAt(0.5);
|
QPointF pos = line.pointAt(0.5);
|
||||||
gases[i]->setPos(pos);
|
gases[i]->setPos(pos);
|
||||||
if (datapoint.cylinderid >= 0 && datapoint.cylinderid < static_cast<int>(d->cylinders.size()))
|
if (datapoint.cylinderid >= 0 && datapoint.cylinderid < static_cast<int>(d->cylinders.size()))
|
||||||
gases[i]->setText(get_gas_string(get_cylinder(d, datapoint.cylinderid)->gasmix));
|
gases[i]->setText(get_gas_string(d->get_cylinder(datapoint.cylinderid)->gasmix));
|
||||||
else
|
else
|
||||||
gases[i]->setText(QString());
|
gases[i]->setText(QString());
|
||||||
gases[i]->setVisible(datapoint.entered &&
|
gases[i]->setVisible(datapoint.entered &&
|
||||||
|
|
|
@ -84,14 +84,14 @@ void TankItem::setData(const struct dive *d, const struct divecomputer *dc, int
|
||||||
struct gasmix gasmix = gasmix_invalid;
|
struct gasmix gasmix = gasmix_invalid;
|
||||||
const struct event *ev;
|
const struct event *ev;
|
||||||
while ((ev = loop.next(*dc)) != nullptr && ev->time.seconds <= plotStartTime)
|
while ((ev = loop.next(*dc)) != nullptr && ev->time.seconds <= plotStartTime)
|
||||||
gasmix = get_gasmix_from_event(d, *ev);
|
gasmix = d->get_gasmix_from_event(*ev);
|
||||||
|
|
||||||
// work through all the gas changes and add the rectangle for each gas while it was used
|
// work through all the gas changes and add the rectangle for each gas while it was used
|
||||||
int startTime = plotStartTime;
|
int startTime = plotStartTime;
|
||||||
while (ev && (int)ev->time.seconds < plotEndTime) {
|
while (ev && (int)ev->time.seconds < plotEndTime) {
|
||||||
createBar(startTime, ev->time.seconds, gasmix);
|
createBar(startTime, ev->time.seconds, gasmix);
|
||||||
startTime = ev->time.seconds;
|
startTime = ev->time.seconds;
|
||||||
gasmix = get_gasmix_from_event(d, *ev);
|
gasmix = d->get_gasmix_from_event(*ev);
|
||||||
ev = loop.next(*dc);
|
ev = loop.next(*dc);
|
||||||
}
|
}
|
||||||
createBar(startTime, plotEndTime, gasmix);
|
createBar(startTime, plotEndTime, gasmix);
|
||||||
|
|
|
@ -155,7 +155,7 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
const cylinder_t *cyl = index.row() == tempRow ? &tempCyl : get_cylinder(d, index.row());
|
const cylinder_t *cyl = index.row() == tempRow ? &tempCyl : d->get_cylinder(index.row());
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::BackgroundRole: {
|
case Qt::BackgroundRole: {
|
||||||
|
@ -259,7 +259,7 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const
|
||||||
case Qt::SizeHintRole:
|
case Qt::SizeHintRole:
|
||||||
if (index.column() == REMOVE) {
|
if (index.column() == REMOVE) {
|
||||||
if ((inPlanner && DivePlannerPointsModel::instance()->tankInUse(index.row())) ||
|
if ((inPlanner && DivePlannerPointsModel::instance()->tankInUse(index.row())) ||
|
||||||
(!inPlanner && is_cylinder_prot(d, index.row()))) {
|
(!inPlanner && d->is_cylinder_prot(index.row()))) {
|
||||||
return trashForbiddenIcon();
|
return trashForbiddenIcon();
|
||||||
}
|
}
|
||||||
return trashIcon();
|
return trashIcon();
|
||||||
|
@ -269,7 +269,7 @@ QVariant CylindersModel::data(const QModelIndex &index, int role) const
|
||||||
switch (index.column()) {
|
switch (index.column()) {
|
||||||
case REMOVE:
|
case REMOVE:
|
||||||
if ((inPlanner && DivePlannerPointsModel::instance()->tankInUse(index.row())) ||
|
if ((inPlanner && DivePlannerPointsModel::instance()->tankInUse(index.row())) ||
|
||||||
(!inPlanner && is_cylinder_prot(d, index.row()))) {
|
(!inPlanner && d->is_cylinder_prot(index.row()))) {
|
||||||
return tr("This gas is in use. Only cylinders that are not used in the dive can be removed.");
|
return tr("This gas is in use. Only cylinders that are not used in the dive can be removed.");
|
||||||
}
|
}
|
||||||
return tr("Clicking here will remove this cylinder.");
|
return tr("Clicking here will remove this cylinder.");
|
||||||
|
@ -301,7 +301,7 @@ cylinder_t *CylindersModel::cylinderAt(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
if (!d)
|
if (!d)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return get_cylinder(d, index.row());
|
return d->get_cylinder(index.row());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
@ -364,7 +364,7 @@ bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, in
|
||||||
// First, we make a shallow copy of the old cylinder. Then we modify the fields inside that copy.
|
// First, we make a shallow copy of the old cylinder. Then we modify the fields inside that copy.
|
||||||
// At the end, we either place an EditCylinder undo command (EquipmentTab) or copy the cylinder back (planner).
|
// At the end, we either place an EditCylinder undo command (EquipmentTab) or copy the cylinder back (planner).
|
||||||
// Yes, this is not ideal, but the pragmatic thing to do for now.
|
// Yes, this is not ideal, but the pragmatic thing to do for now.
|
||||||
cylinder_t cyl = *get_cylinder(d, row);
|
cylinder_t cyl = *d->get_cylinder(row);
|
||||||
|
|
||||||
if (index.column() != TYPE && !changed)
|
if (index.column() != TYPE && !changed)
|
||||||
return false;
|
return false;
|
||||||
|
@ -470,7 +470,7 @@ bool CylindersModel::setData(const QModelIndex &index, const QVariant &value, in
|
||||||
|
|
||||||
if (inPlanner) {
|
if (inPlanner) {
|
||||||
// In the planner - simply overwrite the cylinder in the dive with the modified cylinder.
|
// In the planner - simply overwrite the cylinder in the dive with the modified cylinder.
|
||||||
*get_cylinder(d, row) = cyl;
|
*d->get_cylinder(row) = cyl;
|
||||||
dataChanged(index, index);
|
dataChanged(index, index);
|
||||||
} else {
|
} else {
|
||||||
// On the EquipmentTab - place an editCylinder command.
|
// On the EquipmentTab - place an editCylinder command.
|
||||||
|
@ -711,7 +711,7 @@ void CylindersModel::initTempCyl(int row)
|
||||||
if (!d || tempRow == row)
|
if (!d || tempRow == row)
|
||||||
return;
|
return;
|
||||||
clearTempCyl();
|
clearTempCyl();
|
||||||
const cylinder_t *cyl = get_cylinder(d, row);
|
const cylinder_t *cyl = d->get_cylinder(row);
|
||||||
if (!cyl)
|
if (!cyl)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -737,7 +737,7 @@ void CylindersModel::commitTempCyl(int row)
|
||||||
return;
|
return;
|
||||||
if (row != tempRow)
|
if (row != tempRow)
|
||||||
return clearTempCyl(); // Huh? We are supposed to commit a different row than the one we stored?
|
return clearTempCyl(); // Huh? We are supposed to commit a different row than the one we stored?
|
||||||
cylinder_t *cyl = get_cylinder(d, tempRow);
|
cylinder_t *cyl = d->get_cylinder(tempRow);
|
||||||
if (!cyl)
|
if (!cyl)
|
||||||
return;
|
return;
|
||||||
// Only submit a command if the type changed
|
// Only submit a command if the type changed
|
||||||
|
|
|
@ -507,7 +507,7 @@ static void merge_cylinder_info(cylinder_t *src, cylinder_t *dst)
|
||||||
static void smtk_clean_cylinders(struct dive *d)
|
static void smtk_clean_cylinders(struct dive *d)
|
||||||
{
|
{
|
||||||
int i = tanks - 1;
|
int i = tanks - 1;
|
||||||
cylinder_t *cyl, *base = get_cylinder(d, 0);
|
cylinder_t *cyl, *base = d->get_cylinder(0);
|
||||||
|
|
||||||
cyl = base + tanks - 1;
|
cyl = base + tanks - 1;
|
||||||
while (cyl != base) {
|
while (cyl != base) {
|
||||||
|
|
|
@ -768,8 +768,7 @@ void TestPlan::testMultipleGases()
|
||||||
save_dive(stdout, dive, false);
|
save_dive(stdout, dive, false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gasmix gas;
|
gasmix gas = dive.get_gasmix_at_time(dive.dcs[0], {20 * 60 + 1});
|
||||||
gas = get_gasmix_at_time(dive, dive.dcs[0], {20 * 60 + 1});
|
|
||||||
QCOMPARE(get_o2(gas), 110);
|
QCOMPARE(get_o2(gas), 110);
|
||||||
QVERIFY(compareDecoTime(dive.dcs[0].duration.seconds, 2480u, 2480u));
|
QVERIFY(compareDecoTime(dive.dcs[0].duration.seconds, 2480u, 2480u));
|
||||||
}
|
}
|
||||||
|
@ -963,17 +962,17 @@ void TestPlan::testCcrBailoutGasSelection()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// check diluent used
|
// check diluent used
|
||||||
cylinder_t *cylinder = get_cylinder(&dive, get_cylinderid_at_time(&dive, &dive.dcs[0], { 20 * 60 - 1 }));
|
cylinder_t *cylinder = dive.get_cylinder(get_cylinderid_at_time(&dive, &dive.dcs[0], { 20 * 60 - 1 }));
|
||||||
QCOMPARE(cylinder->cylinder_use, DILUENT);
|
QCOMPARE(cylinder->cylinder_use, DILUENT);
|
||||||
QCOMPARE(get_o2(cylinder->gasmix), 200);
|
QCOMPARE(get_o2(cylinder->gasmix), 200);
|
||||||
|
|
||||||
// check deep bailout used
|
// check deep bailout used
|
||||||
cylinder = get_cylinder(&dive, get_cylinderid_at_time(&dive, &dive.dcs[0], { 20 * 60 + 1 }));
|
cylinder = dive.get_cylinder(get_cylinderid_at_time(&dive, &dive.dcs[0], { 20 * 60 + 1 }));
|
||||||
QCOMPARE(cylinder->cylinder_use, OC_GAS);
|
QCOMPARE(cylinder->cylinder_use, OC_GAS);
|
||||||
QCOMPARE(get_o2(cylinder->gasmix), 190);
|
QCOMPARE(get_o2(cylinder->gasmix), 190);
|
||||||
|
|
||||||
// check shallow bailout used
|
// check shallow bailout used
|
||||||
cylinder = get_cylinder(&dive, get_cylinderid_at_time(&dive, &dive.dcs[0], { 30 * 60 }));
|
cylinder = dive.get_cylinder(get_cylinderid_at_time(&dive, &dive.dcs[0], { 30 * 60 }));
|
||||||
QCOMPARE(cylinder->cylinder_use, OC_GAS);
|
QCOMPARE(cylinder->cylinder_use, OC_GAS);
|
||||||
QCOMPARE(get_o2(cylinder->gasmix), 530);
|
QCOMPARE(get_o2(cylinder->gasmix), 530);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue